2014-06-19 41 views
-1

我试图访问模型的元数据属性来创建一个帮助器,以便基于DataAnnotations自动添加HtmlAttributes。ModelMetadata附加属性始终为空

问题是,属性总是空的。

我有2个基本类,试图在一个空的项目:

namespace MegaInterestingProject 
{ 
    public class HomeController : Controller 
    { 
     public string Index() 
     { 
      var model = ModelMetadata.FromLambdaExpression<HomeModel, string>(x => x.User, new ViewDataDictionary<HomeModel>()); 

      return model.Description; 
     } 
    } 

    public class HomeModel 
    { 
     [Required] 
     [MaxLength(13)] 
     [MinLength(11)] 
     [DisplayName("displayname")] 
     [Description("description")] 
     public string User { get; set; } 
    } 
} 

这里model.Description永远是空的,AdditionalValues字典总是空的。

这里可能缺少一些东西吗?

这里是一个参考项目,我在GitHub上说:https://github.com/erickgirard/TestHtmlAttributesHelper

回答

0

你没有放置在模型中的属性,但在模型的属性。

访问模型中的属性的元数据是这样的自定义辅助函数:

public static MvcHtmlString CustomHelperFunctionFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
{ 
    var propertyName = ExpressionHelper.GetExpressionText(expression); 
    var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
    var displayname = metadata.DisplayName; 
    var description = metadata.Description; 

    return new MvcHtmlString("have fun!"); 
} 
+0

你为什么要声明一个变量propertyName的?你似乎并没有真正使用它呢?再说,我已经走了泛型方法和已经完成一个使用这种结构的扩展方法,但是仍然为空的属性 – Erick

+0

确实,这是我从我的一个实际功能中挑选出来的一些代码,我修改了这些代码进行了说明,但是我将它留下来说明如何知道哪些属性在你实际使用的模型中,这是你可以用来扩展@Htmlhelper的html helper函数的代码,但重点是:你试图从模型级读取元数据,而实际的属性值驻留在在model.property级别。 – souplex

+0

我做了一个代码的复制和粘贴。仍然是空的。我编辑了我的第一篇文章,在github上进行了一个测试项目 – Erick

2

你使用产生ModelMetadata错误的属性。您需要使用DisplayAttributeSystem.ComponentModel.DataAnnotations(在System.ComponentModelDisplayNameAttribute

public class HomeModel 
{ 
    [Display(Name = "displayname", Description = "description")] 
    public string User { get; set; } 
}