MVC3 - 在html.helper中获取数据属性

时间:2011-10-07 22:52:06

标签: c# asp.net-mvc-3 data-annotations

我正在尝试创建自定义属性来控制自定义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帮助器方法中检索我的自定义属性。

1 个答案:

答案 0 :(得分:2)

实现此目的的最佳方法是让您的属性实现IMetadataAware。在OnMetadataCreated方法的实现中,您应该向metadata.AdditionalValues字典添加值。然后,您可以在帮助程序或您有权访问ModelMetadata的任何其他位置检索该值。

请注意,此解决方案是首选,因为它实际上并不编码任何有关元数据由属性驱动的信息。