【笔记】ASP.NET MVC Model元数据
2020-12-13 14:35
标签:style blog http color get 使用 问题1:什么叫Model元数据? Model元数据,是针对数据类型的一种描述信息。由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此Model 元数据为树形结构: 在ASP.NET MVC中对应被定义为类型 “ModelMetadata”,其作用主要体现在以下两个方面: 1、控制数据类型本身及其成员属性在界面上的呈现方式; 上面代码将MVC框架定义的Model元数据精简为一个属性,该属性用于呈现Model或者Model数据中元素在UI上的显示名称。这样说过于抽象,下面的的代码是我们在MVC程序开发时候常写写的界面模型类: 给CustomerModel的 Namei属性添加DisplayName 特性,Gender属性不做任何操作,倘若在强类型视图上使用@Html.DisplayFor(d=>d.Name); @Html.DisplayFor(d=>d.Gender)显示用户信息,会发现Name会显示“用户姓名”,而Gender属性的显示仅仅是原样输出为Gender; 事实上,DisplayName特性就是通过改变ModelMetadata的DisplayName来达到这一效果,也就是说,特性的作用在于定制ModelMetadata。 2、Model绑定和验证提供必不可少的元数据 绑定以后提及,至于验证,看下面代码: 同理,Required特性定制了Model元数据中的IsRequired属性以达到针对模型的验证。 问题2:如何针对Model元数据进行定制? 问题1中说明了ModelMetadata类的各属性控制了数据在UI中的呈现、验证、绑定。那么如何获取或设置ModelMetadata类的各属性呢?答案是使用特性【Attribute】。 可以用于定制Model元数据的特性有如何: 1、UIHintAttribute HtmlHelper定义了一系列模板方法,比如DisplayFor/Display、EditorFor/Editor,所谓模板方法,就是Model数据与HTML标签的封装。其效果类似于强类型的PartialView。 UIHintAttribute特性的作用就在于为Model中的属性或者字段显示指定模板,当UI出现@Html.DisplayFor(d=>d.Name)语句,ASP.NET MVC将会用UIHintAttribute指定的模板展示Model数据。 MVC有一套寻找模板的规则,默认吗没有指定模板情况下,MVC将从@DisplayFor(d=>d.Name) lamba表达式中得到Name的数据类型,根据该数据类型在预定义的目录下去寻找不同的模板。而同一种数据类型模板,又可以分为编辑模板(EditorFor)、显示模板(DisplayFor)。倘若指定了一个具体的模板名称,ASP.NET MVC 会自动采用该模板来生成最终的HTML。而指定的模板通常按显示模式定义在EditorTemplates目录或DisplayTemplates目录下。这些目录可以存在于Views/Shared、Views/{ControllerName}下; 可以做个测试。 首先定义数据模型: 通过UIHint特性指定了显示模板为“Name”; 控制器中实例一个CustomerModel对象,并传递给视图View。 新建View如下: 1 //namespace:System.Web.Mvc
2 public class ModelMetadata
3 {
4 //其它成员
5
6 //当前模型类型
7 //倘若用数据库中树形结构解释,这个属性相当于Id
8 public Type ModelType { get; set; }
9
10 //当前模型类型所属类型
11 //倘若用数据库中树形结构解释,这个属性相当于ParentId
12 public Type CotainerType { get; set; }
13
14 }
1 //namespace:System.Web.Mvc
2 public class ModelMetadata
3 {
4 //其它成员
5
6 //模型名称
7 public virtual string DisplayName { get; set; }
8 }
1 //用户界面模型
2 public class CustomerModel
3 {
4 [DisplayName("用户姓名")]
5 public string Name{get;set;}
6
7 public string Gender{get;set;}
8 }
1 //namespace:System.Web.Mvc
2 public class ModelMetadata
3 {
4 //其它成员
5
6 //是否必填
7 public virtual bool IsRequired{ get; set; }
8 }
1 1 //用户界面模型
2 2 public class CustomerModel
3 3 {
4 4 [Required]
5 5 public string Name{get;set;}
6 6
7 7 public string Gender{get;set;}
8 8 }
1 public class CustomerModel
2 {
3 [UIHint("Name")]
4 public string Name { get; set; }
5
6 public string Gender { get; set; }
7 }
1 public ActionResult Index()
2 {
3 CustomerModel model = new CustomerModel()
4 {
5 Name = "小李",
6 Gender = "男"
7 };
8 return View(model);
9 }
1
2
4 @Html.DisplayFor(d => d.Gender)
5
下一篇:算法第二章上机实践报告