原文地址
1.ASP.NET MVC 2 Templates, Part 1: Introduction[翻译]
理解你的模型
ModelMetadata是我们介绍的其中一个MVC2的类.这个类被设计来告诉你关于对象中你想用来显示或者编辑的信息.一般我们会在写模版是用到,这个元数据实际上那里都可以用的,即使不在模版中.
What is a Model?
当谈到ModelMetadata时,“model”的概念就可以比以前更加有点模糊不清了.
以上篇文章中的model作为实例:
public class Contact { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
你为这个model创建了一个强类型的视图,同时如果在这个视图中你进入ViewData.ModelMetadata属性,这时这个model在这里是Contact对象.
而且,通过这个元数据对象,你还可以获取所有与属性有关的元数据.会返回一个集合的ModelMetadata对象,对应每一个属性.在我们的Contact对象中,我们会得到3个新的元数据对象,对应FirstName,LastName和Age.以FirstName的元数据为例,这个model类型为String(同时container类型为Contact).这样,你就可以递归地获取,不管对象的属性有多少层.
怎么获取(元数据)?
使用当前model
最普通的方法获取元数据是用ViewData的ModelMetadata属性,就像下面显示的一样.这个元数据对象描述ViewData的Model.当你为一个对象渲染模版时,这时获取元数据的最普通方法.
从已有的元数据的properties 属性中获取
如果你有一个元数据对象在手中,你可以调用Properties属性,这是一个会返回一组元数据对象对应每个model的属性.
从表达式树中获取
ModelMetadata这个类有两个静态的方法:FromStringExpression和FromLambdaExpression.这两个方法被用作将一个字符串表达式(例如"PropertyName")或者一个代码表达式(例如:"m => m.PropertyName")转换为ModelMetadata,大部分HTML helpers已经按照这两个方法重写.
元数据里面有什么?
在讲解元数据由什么构成之前,首先快速回顾一下ModelMetadata对象有什么种类的信息是可用的.
model和它的容器的属性
- Model and ModelType
得到model它自己的值和类型.尽管model的值可能为空,我们仍然可以知道model的类型(例如,我们可以从Lambda表达式中推导信息).
- ContainerType and PropertyName
得到容器对象和属性名,容器即值的来源,不是所有models都来自properties,所以它们可能为空.
- Properties
得到用来描述已存在对象属性的ModelMetadata对象的集合
关于model的元数据
- ConvertEmptyStringToNull
标记forms中任何posted会服务端的空白字符串应该转换为空.默认:true
- DataTypeName
一个用作数据类型元信息的字符串(例如,为了让你知道这个字符串实际是一个email地址).一些著名的数据类型包括"Email","Html","Password",和"Url".默认:null.
- Description
关于model的长文本描述.默认:null
- DisplayFormatString
用作在模版中显示model值的格式化的字符串.默认:null
- DisplayName
这个model值的显示名.在模版和Html.Label/LabelFor中用作label的text.默认:null
- EditFormatString
用作在模版中编辑model值的格式化的字符串.默认:null
- HideSurroundingHtml
标记这个字段不应该有HTML包围(例如,一个label).通常当模版会生成隐藏的input时使用.默认:null
- IsComplexType
标记系统是否认为它是一个复合的类型(因此会默认选择复合对象的模版而不是字符串的模版).只读
- IsNullableValueType
标记这个model是不是一个可空对象类型(即,Nullable<T>).只读
- IsReadOnly
.只读
- IsRequired
是否是必须的.默认可空类型为true,其它为false
- NullDisplayText
当试图显示一个空model时显示的信息.默认:null
- ShortDisplayName
这个model的短显示名.用来显示表格列表数据视图的标题.如果这个字段是空的,就用DisplayName.默认:null
- ShowForDisplay
这个model是否应该在display model(应该是模版?)中显示.默认:true
- ShowForEdit
这个model是否应该在edit model(应该是模版?)中显示.默认:true
- SimpleDisplayText
Text which should be shown for this model when summarizing what would otherwise be a complex object display. Default: see below
- TemplateHint
一个用作暗示使用什么模版的字符串.默认:null
- Watermark
当用textbox编辑时显示的水印.默认:null
Helper方法:
- GetDisplayName()
这个方法用作从model中获取显示名称.如果DisplayName不为空,返回DisplayName;然后检查PropertyName,不为空侧返回;都为空的话,返回ModelType.Name.
- GetValidators()
这个方法用来获取这个model可用的validators.validators既可以用作服务端的model的验证,也可以生成客户端的验证规则.
SimpleDisplayText的默认值有一下规则:
如果model为空,返回NullDisplayText.
如果这个类型已经重写了Model.ToString(),测返回它
如果这个model没有属性,返回String.Empty
如果model的第一个属性为空,返回这个属性的NullDisplayText值,否则返回第一个属性的ToString()值
ModelMetadata 来自那里?
MVC2增加了一个可插入的元数据系统.默认ModelMetadata对象会从attributes中获取数据来构造,首先用System.ComponentModel 和System.ComponentModel.DataAnnotations命名空间的attributes.
当使用默认的DataAnnotations,下列attributes会影响元数据:
- [HiddenInput] (from System.Web.Mvc)
应用这个特性会在编辑model时生成一个隐藏的input.默认,也会隐藏使用的包围HTML,除非设置DisplayValue标记为true;在这种情况下,既生成显示值(用包围HTML)也会生成隐藏input.除了设置HideSurroundHtml,也可以设置"隐藏Input"的TemplateHint(可以用重写[UIHint])
- [UIHint] (from System.ComponentModel.DataAnnotations)
用UI暗示的名称设置TemplateHint属性.首先寻找一个"MVC"的外观层类型,如果没有,查找一个empty或者null的外观层.
- [DataType] (from System.ComponentModel.DataAnnotations)
设置DataTypeName属性
- [ReadOnly] (from System.ComponentModel)
设置IsReadOnly属性.注意,因为我们使用的是类描述符(Type descriptors),任何属性没有public setter会自动有[ReadOnly] attribute
- [DisplayFormat] (from System.ComponentModel.DataAnnotations)
如果在这个attribute中设置NullDisplayText就会在model的元数据中设置NullDisplayText,如果设置DataFormatString就会在demol的元数据中设置DisplayFormatString,如果ApplyFormatInEditMode同时设置为true,就会在model的元数据中设置EditFormatString,设置ConvertEmptyStringToNull就会在model的元数据中设置ConvertEmptyStringToNull
- [ScaffoldColumn] (from System.ComponentModel.DataAnnotations)
即设置ShowForDisplay也设置ShowForDisplay属性
- [DisplayName] (from System.ComponentModel)
设置DisplayName属性
结语
现在当我们编写模版时,知道更加多一点关于元数据的知识.下一篇,我们会谈及MVC2的默认模版,和展示如果把他们写成.asax文件时会是什么样的.
to be continue….