在使用MVC3的时候,在创建和编辑Model的时候,我们总是能用@Html.LabelFor(model=>model.Name)来生成一个需要显示的字段名称。但是在Details视图中,VS 2010却不给力了,愣是之显示Model中的字段名字,不管你是否指定了DisplayName。
这在用起来的时候,多少有那么一点遗憾,每次都要手动的去调整。1次,2次能接受,但是大片的Model要这么调整,啥时候是个头?而且Model今天的DisplayName可以是这个,明天DisplayName修改之后,怎么办?重来一遍?
还是找些方法来替代这种无比Ugly的方法吧,怎么也要找点好的方法。网上提供了一种使用Template的方法,来看看吧:
首先,他建议在~/Views/Shared/DisplayTemplates/下面创建模板文件ModelName.cshtml,文件内容如下:
@using System.ComponentModel.DataAnnotations
@using System.ComponentModel
@model ModelName
@{
var fields = Model.GetType().GetProperties();
foreach(var field in fields){
if (field != null)
{
var display = ((DisplayNameAttribute[])field.GetCustomAttributes(typeof(DisplayNameAttribute), false)).FirstOrDefault(); // 如果是是定义的是DisplayAttribute,也许要改改代码.:-)
if(display != null){
if (display.DisplayName.Length > 0)
{
@display.DisplayName
}
}
}
}
}
可以看出,这个是对每个Model进行定义的模板,恩,不错~这的确能够解决问题,如果是Details的话,直接用模板处理就好。不过,这个也太不通用了,好吧,我们改改,改成一个方法吧:
@helper ShowDisplayName(string propertyName){
var property = Model.GetType().GetProperty(propertyName);
if(property != null){
var displayName = ((DisplayNameAttribute[])property.GetCustomAttributes(typeof(DisplayNameAttribute), false)).FirstOrDefault();
if(displayName.DisplayName.Length>0)
{
@displayName.DisplayName
}
}
}
怎么样,改成了一个帮助方法之后,我们就可以摆脱模板的困扰了,直接在想用的时候,来上一句: @ShowDisplayName("ModelPropertyName"),是不是很酷?这样,只要将这个方法放到公共的Helper中,就可以在整站通用了,不过要小心,在IEnumerable<modelName>的View中,这个方法就不太好用了。
当然,我们能改,改成能用,不过改来改去,还是有点麻烦啊(我最怕的就是麻烦)。那就看看MVC代码是怎么实现的,我们仿造一个像DisplayFor(...)这样的方法来吧,即简单又方便。在翻MVC代码的时候,神奇的事情出现了——MVC竟然在最新的代码版本中提供了实现!
这真是有趣,原来MVC的TEAM也一直在努力改造中,放出的方法叫DisplayNameFor(...),太有趣了,既然提供了方法,我就不用这么痛苦了,简单的方法 —— Copy & Comlie 整合到项目中了(当然,升级也是一条路,但不是每个人都有机会走这条路)。这其中的需要注意的是,新版的使用了一个ModelMetaData.FromStringExpression的三参数方法,这个方法在现有的MVC3版本中是没有的,这怎么办? take it easy。我们只需要将其方法统一转成两个参数的方法即可。
好了,到这里,这个问题也就探讨的差不多了,跟进一步,留给你了~ 有好的心得,记得分享!:-)