如何在MVC模型中设置DisplayName?MVC5+SQLite场景下的特殊需求
这两个问题都是关于MVC模型中DisplayName的设置,我来一步步给你讲清楚:
在MVC里给模型属性设置显示名称,最常用的有两种方式,都不需要修改视图,直接在模型层配置即可:
使用
DisplayNameAttribute(简单直接)
直接在模型属性上添加这个特性,视图里的辅助方法会自动读取这个名称。示例代码:public class ArticleModel { [DisplayName("文章标题")] public string Title { get; set; } [DisplayName("发布日期")] public DateTime PublishDate { get; set; } }视图里用
@Html.DisplayNameFor(m => m.Title)或者@Html.LabelFor(m => m.PublishDate)时,就会显示你设置的自定义名称,不用手动写死文字。使用
DisplayAttribute(功能更丰富)
这个特性比DisplayNameAttribute更灵活,除了设置显示名称,还能支持本地化、描述文本等,推荐在需要扩展功能的场景使用:public class ArticleModel { [Display(Name = "文章标题", Description = "请输入不超过100字的标题")] public string Title { get; set; } }视图里的辅助方法同样会自动读取
Name属性的值作为显示名称。
核心逻辑和第一个问题完全一致——不管你底层存储的是tick(long类型)还是其他格式,只要在模型(或ViewModel)的对应属性上配置DisplayName/Display特性,视图就能自动读取显示名称,完全不需要修改视图代码。
举个实际场景的例子:
假设你的实体模型是为了适配SQLite,用long类型存储TimeSpan的tick值,你可以直接在这个属性上加特性:
public class ProjectTaskModel { // 存储TimeSpan的tick值 [DisplayName("任务耗时")] public long DurationTicks { get; set; } // 可选:加一个计算属性,方便在视图显示可读的TimeSpan格式 [Display(Name = "任务耗时(可读格式)")] public TimeSpan Duration => TimeSpan.FromTicks(DurationTicks); }
如果你的视图原本是绑定DurationTicks属性,用@Html.DisplayNameFor(m => m.DurationTicks)渲染标题,现在会自动显示“任务耗时”,完全不用改动视图里的代码。
如果你的实体模型是自动生成的(比如EF的Code First),不想直接修改实体类,那更推荐用ViewModel来包装:
public class ProjectTaskViewModel { [DisplayName("任务耗时")] public long DurationTicks { get; set; } public TimeSpan Duration => TimeSpan.FromTicks(DurationTicks); }
控制器里把实体模型转成ViewModel传给视图,视图绑定ViewModel的属性,既不修改实体也不改动视图,完美解决你的需求。
内容的提问来源于stack exchange,提问作者vVvegetable

