在理解Model时有个很重要的概念叫ModelMetaData。顾名思义,它表示模型的元信息。
例如,我们可以通过访问它的Properties属性得到模型的公共属性。
一般我们喜欢把一个表征数据实体的类叫做模型,例如,
public class Contact {
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public int Age {get; set;}
}
我们会把Contact叫做模型;但是,当我们谈到ModelMetaData时,情况有些变化。当我们
在视图里访问ViewData.ModelMetaData时,ModelMetaData能提供Contact的所有元信息;
接着我们可以通过ModelMetaData.Properties来得到Contact的三个公共属性的元信息,是
三个ModelMetaData实例!让我们再进一步,当访问FirstName对应的ModelMetaData实例时,
会得到ModelType为string,并且ContainerType为Contact。

通常,ViewData的ModelMetaData属性提供了一个该类的实例。另外,我们也可以通过
ModelMetaData的类静态方法FromStringExpression和FromLambdaExpression来
创建该类的实例。这两个方法会把字符串(例如"PropertyName")或者是一个表达式(例如
“m=>m.PropertyName")转换成相应的ModelMetaData实例。另外,这也是为什么大部分
Html Helper的扩展方法一般会至少重载两个版本的原因。
那么一个ModelMetaData实例中究竟存储了哪些信息呢?
1. Model和ModelType
   模型的值及其类型;其中,值可以为null。
2. ContainerType和PropertyName
   模型所在容器对象的类型以及模型的值是来自于容器对象的哪个属性。并不是所有的模型
   都来自于属性值,所以这些成员可以为null。
3. Properties
   模型的所有公共属性。
另外我们还可以从ModelMetaData获取关于模型的其它信息:
1. ConvertEmptyStringToNull
   标志用于指示postback回来的空字符串是否需要转换成null;
   缺省值为true;
2. DataTypeName
   一些常见的DataType例如EmailAddress, Html, Password, Url;
   缺省值为null;
3. Description
   缺省值为null;
4. DisplayFormatString
   在模板里显示模型值时用到;
   缺省值为null;
5. DisplayName
   主要用于Html.Label/LabelFor来生成UI上的提示信息。
   缺省值为null;
6. EditFormatString
   在模板里编辑模型值时用到;
   缺省值为null;
7. HideSurroundingHtml
   标志位;通常用于生成hidden input;
   缺省值为null;
8. IsComplexType
   不能在代码中设置该值;
9. IsNullableValueType
   不能在代码中设置该值;
10. IsReadOnly
11. IsRequired
12. NullDisplayText
    当模型值为null时显示的文本;
    缺省值为null;
13. ShortDisplayName
    用于表格式list view的标题;如果为null,就使用DisplayName;
14. ShowForDisplay
    标志位表针在display模式时是否显示;
    缺省值为true:
15. ShowForEdit
    标志位表针在Edit模式时是否显示;
    缺省值为true:
16. SimpleDisplayText
    指示一个复杂对象的概要
17. TemplateHint
    hint影响应该对该模型应用哪个模板;
    缺省值为null;
18. Watermark
    在文本框中编辑该模型时作为水印显示的文本;
    缺省值为null;
还有两个Helper方法:
1. GetDisplayName() 优先顺序 DisplayName ?? PropertyName ?? ModelType.Name;
2. GetValidators() 可以运行server端验证,或者是生成client端的验证规则;
那么,ModelMetaData的值从哪儿来的呢?
默认情况下,来自于System.ComponentModel和System.ComponentModel.DataAnnotations命名空间下的属性类;
但是在asp.net mvc 2中,其提供者是pluggable的。
当使用默认的DataAnnotations model metadata provider时,如下属性类会影响模型的元信息:
1. HiddenInput (System.Web.Mvc)
2. UIHint (System.ComponentModel.DataAnnotations)
3. DataType (System.ComponentModel.DataAnnotations)
4. ReadOnly (System.ComponentModel)
5. DisplayFormat (System.ComponentModel.DataAnnotations)
6. ScaffoldColumn (System.ComponentModel.DataAnnotations)
   它会影响ShowForDisplay和ShowForEdit的值;
7. DisplayName
Advertisements