ASP.NET MVC 2 Templates, Part 2: ModelMetadata[翻译]

原文地址

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这个类有两个静态的方法:FromStringExpressionFromLambdaExpression.这两个方法被用作将一个字符串表达式(例如"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….

posted @ 2011-11-10 23:13  zhangweiwen  阅读(677)  评论(0编辑  收藏  举报