Я пытаюсь создать настраиваемый атрибут для управления форматированием в настраиваемом вспомогательном объекте HTML. Исходный код для моего настраиваемого селекторного класса (Код от http://forums.asp.net/t/1649193.aspx/1/10).
public static MvcHtmlString DdUovFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var m = expression.Body.GetType();
IDictionary<string, object> validationAttributes = htmlHelper
.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);
if (htmlAttributes == null)
htmlAttributes = validationAttributes;
else
htmlAttributes = htmlAttributes.Concat(validationAttributes).ToDictionary(k => k.Key, v => v.Value);
return SelectExtensions.DropDownListFor(htmlHelper, expression,
selectList, optionLabel, htmlAttributes);
}
Мой пользовательский атрибут
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property |
AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class LookUpAttribute : Attribute
{
public LookUpAttribute(Type providerName)
{
this.providerName = providerName;
}
protected ILookup providerName;
}
Моя проблема в том, что я не могу понять, как получить мой пользовательский атрибут в HTML-методе помощника.
Лучший способ достичь этого - реализовать свой атрибут IMetadataAware
. При реализации метода OnMetadataCreated
вы должны добавить значения в словарь metadata.AdditionalValues
. Затем вы можете получить значение в своем помощнике или где бы вы ни находились в ModelMetadata.
Обратите внимание, что это решение предпочтительнее, потому что оно фактически не кодирует какую-либо информацию о том, что ваши метаданные управляются атрибутами.