• 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….

  • 相关阅读:
    docker容器的时间同步
    Java中的各种bean对应的意义(VO,PO,BO,QO, DAO,POJO,DTO)
    Vue-admin工作整理(十九):从数字渐变组件谈第三方JS库Count-to的使用
    HTTP 方法:Get与Post分析
    Java核心知识盘点(三)- 框架篇-Spring
    Java核心知识盘点(二)- 缓存使用
    Java核心知识盘点(一)- 数据存储
    Java基础知识盘点(三)- 线程篇
    Java基础知识盘点(二)- 集合篇
    Java基础知识盘点(一)- 基础篇
  • 原文地址:https://www.cnblogs.com/lemontea/p/2245076.html
Copyright © 2020-2023  润新知