Asp.Net MVC4.0 官方教程拓展之一--为模型属性增加中文显示名称
官方教程已经翻译完了,在此基础上,再做一些拓展,目标是做本土化调整,适合国内项目开发的现状,比如,对英语国家来说,库表字段名、模型属性名、页面显示名都可以一样,完全没必要区分出来,而对于国内来说,显示的列表页面列标题栏或是详细页面的字段说明是中文的,库表里存储的字段和模型属性是英文。目前没有明确的规划,想到哪写到哪,来源也杂,有查阅英文资料,有参阅前人写过的文章,还有自己摸索的,先写,最终再整理排序。
本文我们就来解决一下上文提到的如何为模型属性增加中文显示名称的问题。在官方教程的例子中,你会发现MVC已经做了汉化,但是汉化并不完全,比如很多自动生成的按钮和链接,都是英文的。在列表页面,列标题栏是英文名称,详细页面的字段说明,也是英文的,很明显,不能将这样的展示作为最终效果交付。
首先我们来看一下官方教程中生成的Movie的Index视图,打开Views/Movie/Index.cshtml文件,脚手架自动生成的列表页面表格的表头如下所示:
<tr> <th> @Html.DisplayNameFor(model => model.Name) </th> <th> @Html.DisplayNameFor(model => model.Genra) </th> <th> @Html.DisplayNameFor(model => model.Price) </th> <th> @Html.DisplayNameFor(model => model.Rating) </th> <th> @Html.DisplayNameFor(model => model.Date) </th> <th></th> </tr>
要进行汉化,最笨的办法是直接修改视图,例如将@Html.DisplayNameFor(model => model.Name)修改为“影片名称”。这样做可以实现汉化效果,但是非常繁琐,耗时耗力且易出错。列比较多的情况下,容易发生列对应错位问题。若要修改属性的中文显示名称,同样需要在CRUD多个视图进行手工调整,工作量显而易见是很大的。而且,也违背前面所提到的“干爽”(DRY)原则。
由前面教程中为模型增加验证属性,我们可以得到启发,是不是可以仅在模型类中定义中文显示名称一次,而在各个视图中自动应用呢?事实上,MVC已经做了该方面的处理工作。由上面代码可以知道,脚手架机制并没有在视图代码中写死,直接在列标题中写Name/Genra等,而是调用了Html助手类的DisplayNameFor方法,传入模型属性,获取显示名称。你仅需要在模型类中为属性增加中文显示名称属性即可。具体做法是,打开Models/Movies.cs,增加Display属性,代码如下所示:
public class Movie { public int ID { get; set; } [Display(Name="片名")] public string Name { get; set; } [Display(Name = "风格")] public string Genra { get; set; } [Display(Name = "价格")] public decimal Price { get; set; } [Display(Name = "上映日期")] public DateTime Date { get; set; } [Display(Name = "评价")] public string Rating { get; set; } }
即为模型属性增加Display,设置参数Name值为要显示的中文名称。修改后执行生成项目操作,运行,可以看到,列表页面以及增删改页面都自动生效了,显示的是中文字段名称。
查看Display属性官方帮助如下:
命名空间: System.ComponentModel.DataAnnotations
DisplayAttribute 类:提供一个通用特性,使您可以为实体分部类的类型和成员指定可本地化的字符串。
上文我们使用的Name参数,其实远远不止这些,本想在下面挑几个实用的来说一下,比如第一个AutoGenerateField,官方说明是获取或设置一个值,该值指示是否应自动生成用户界面以显示此字段。
在实际业务开发中,往往有些字段是隐藏用于后台处理的,不需要也不应该显示给用户,于是尝试性加了,如下
[Display(AutoGenerateField = false, Name = "风格")]
public string Genra { get; set; }
结果……发现无论如何,该参数无法生效……设置参数AutoGenerateField 为false的Genra ,编译和运行都未报错或者警告,但是运行结果是,始终会在视图中自动生成……既查了官方说明,也根据关键字搜了网上结果,没找到一个合理的解释。又尝试了一下下面的Description参数,同样没有效果。于是,推测,System.ComponentModel.DataAnnotations命名空间下的除了Name以外的这几个参数,仅在WinForm下有效,而在ASP.NET MVC下,无效……望有知情人士告知我的推测是否正确或者真正的原因是什么或者我的用法哪里有误,多谢:)