惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
量子位
博客园 - 司徒正美
V
V2EX
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
N
Netflix TechBlog - Medium
L
LangChain Blog
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 大浪淘沙

easyui datagrid 诡异的无法显示问题 对Repository模式误用的反思和纠正 转载 SVN中trunk,branches,tags用法详解 operamasks-ui2.0 +MVC4.0+EF5.0实战 当EntityFramework遇上Json,引爆 循环引用 这颗雷 operamasks-ui2.0 +MVC4.0+EF5.0实战之四 部门管理功能及网格控件(datagrid) operamasks-ui2.0 +MVC4.0+EF5.0实战之三 业务功能区域及标签页控件(tab) operamasks-ui2.0 +MVC4.0+EF5.0实战之二 功能菜单及树形控件(Tree) operamasks-ui2.0 +MVC4.0+EF5.0实战之一 开篇及布局控件介绍 EasyUI1.3.1+MVC4.0+EF5.0 番外篇 关于前台框架的选择 EasyUI、DWZ、ligerui EasyUI1.3.1+MVC4.0+EF5.0实战之一 开篇及布局控件介绍 Asp.Net MVC4.0 官方教程 入门指南之十--查看Detail和Delete方法 Asp.Net MVC4.0 官方教程 入门指南之九--为模型添加验证 Asp.Net MVC4.0 官方教程 入门指南之八--为Movie模型和库表添加字段 Asp.Net MVC4.0 官方教程 入门指南之七--增加搜索方法和视图 Asp.Net MVC4.0 官方教程 入门指南之六--查看Edit方法和Edit视图 Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图 Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器
Asp.Net MVC4.0 官方教程拓展之一--为模型属性增加中文显示名称
大浪淘沙 · 2012-12-11 · via 博客园 - 大浪淘沙

官方教程已经翻译完了,在此基础上,再做一些拓展,目标是做本土化调整,适合国内项目开发的现状,比如,对英语国家来说,库表字段名、模型属性名、页面显示名都可以一样,完全没必要区分出来,而对于国内来说,显示的列表页面列标题栏或是详细页面的字段说明是中文的,库表里存储的字段和模型属性是英文。目前没有明确的规划,想到哪写到哪,来源也杂,有查阅英文资料,有参阅前人写过的文章,还有自己摸索的,先写,最终再整理排序。

本文我们就来解决一下上文提到的如何为模型属性增加中文显示名称的问题。在官方教程的例子中,你会发现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下,无效……望有知情人士告知我的推测是否正确或者真正的原因是什么或者我的用法哪里有误,多谢:)