Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之。在整个Action方法的执行过程中,Model元数据的解析是一个非常重要的环节。ASP.NET MVC中的Model实际上View Model,表示最终绑定到View上的数据,而Model元数据描述了Model的数据结构,以及Model的每个数据成员的一些特性。正是有了Model元数据的存在,才使模板化HTML的呈现机制成为可能。此外,Model元数据支撑了ASP.NET MVC的Model验证体系,因为针对Model的验证规则正是定义在Model元数据中。ASP.NET MVC的Model元数据通过类型ModelMetadata表示。ModelMetadata通过一系列的属性描述了Model及其成员相关的元数据信息,在正式介绍这些元数据选项之前,我们很有必要先来了解一下Model元数据层次化结构。
一、Model元数据层次化结构
作为Model的数据类型可以一个和简单的字符串或者是一个值类型的对象,也可能是一个复杂的数据类型。对于一个复杂的数据类型,基于类型本身和数据成员的元数据都通过一个ModelMetadata来表示,而某个数据成员又可能是一个复杂类型,所以通过ModelMetadata对象表示的Model元数据实际上具有一个树形层次化结构。
举个例子,我们具有一个具有如下定义的表示联系人的数据类型Contact。属性Name、PhoneNo、EmailAddress和Address分别代表姓名、电话号码、邮箱地址和联系地址。联系地址通过另一个数据类型Address表示,属性Province、City、District和Street分别表示所在省份、城市、城区和街道。
1: public class Contact 2: { 3: public string Name { get; set; } 4: public string PhoneNo { get; set; } 5: public string EmailAddress { get; set; } 6: public Address Address { get; set; } 7: } 8: public class Address 9: { 10: public string Province { get; set; } 11: public string City { get; set; } 12: public string District { get; set; } 13: public string Street { get; set; } 14: }
如果将Contact类型作为Model,作为其元数据的ModelMetadata不仅仅具有Contact类型本身和其属性成员的描述,由于其Address属性是一个复杂类型,元数据还需要描述定义在该类型中的4个属性成员。下图反映基于Contact类型的Model元数据的层次化结构。
表示Model元数据的ModelMetadata类型不仅用于描述某个作为Model的数据类型,还用于递归地描述其所有属性成员(不包含字段成员),所以ModelMetadata具有一个树型层次化结构,这也可以从ModelMetadata的定义可以看出来。
1: public class ModelMetadata 2: { 3: //其他成员 4: public virtual IEnumerable<ModelMetadata> Properties { get; } 5: }
如上面的代码片断所示,ModelMetadata具有一个类型为IEnumerable<ModelMetadata>的只读属性Properties,表示用于描述属性/字段成员的ModelMetadata集合。ModelMetadata的层次化结构可以通过如下图所示的UML来体现。由于基于类型的ModelMetadata和基于数据成员的ModelMetadata是一种包含关系,我们可以将前者称为后者的容器(Container)。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 元数据
, 数据类型
, 类型
, model
, 一个
, 成员
元数据库
,以便于您获取更多的相关知识。