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元数据层次化结构。[本文已经同步到《How ASP.NET MVC Works?》中]
目录
一、Model元数据层次化结构
二、基本Model元数据信息
三、Model元数据的定制
UIHintAttribute
HiddenInputAttribute与ScaffoldColumnAttribute
DataTypeAttribute与DisplayFormatAttribute
EditableAttribute与ReadOnlyAttribute
DisplayAttribute与DisplayNameAttribute
RequiredAttribute
四、IMetadataAware接口
AllowHtmlAttribute
实例演示:创建实现IMetadataAware接口的特性定制Model元数据
作为Model的数据类型可以一个和简单的字符串或者是一个值类型的对象,也可能是一个复杂的数据类型。对于一个复杂的数据类型,基于类型本身和数据成员的元数据都通过一个ModelMetadata来表示,而某个数据成员又可能是一个复杂类型,所以通过ModelMetadata对象表示的Model元数据实际上具有一个树形层次化结构。
举个例子,我们具有一个具有如下定义的表示联系人的数据类型Contact。属性Name、PhoneNo、EmailAddress和Address分别代表姓名、电话号码、邮箱地址和联系地址。联系地址通过另一个数据类型Address表示,属性Province、City、District和Street分别表示所在省份、城市、城区和街道。
2: {
string Name { get; set; }
string PhoneNo { get; set; }
string EmailAddress { get; set; }
public Address Address { get; set; }
7: }
class Address
9: {
string Province { get; set; }
string City { get; set; }
string District { get; set; }
string Street { get; set; }
14: }