您的位置:首页 > 编程语言 > ASP

.NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式2

2013-12-16 23:45 766 查看

.NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)

阅读目录:

4.ModelMetadata(ModelMetadata元数据如何支撑Model与View之间的组合关系)

4.1.ModelMetadata元数据结构(元数据与数据实体的结构关系)

4.2.View与Model的基本关系及使用方式(View的呈现基础)

5.通过对ViewModel使用预定义Attribute设置ModelMetadata(扩展元数据设置IMetadataAware)

5.1.ViewModel的领域类型(类型的两个层面的含义,CLR类型、领域语言)

5.2.System.ComponentModel.DataAnnotations中元数据控制特性与ASP.NETMVC中元数据控制特性

5.3.IMetadataAware与扩展元数据定制接口(适当继承预定义元数据控制对象)

6.数据注释元数据控制机制(面向UI框架的基础System.ComponentModel.DataAnnotations命名空间)

6.1.System.ComponentModel 组件对象模型的生命周期(系统组件的基本特征)

6.2.设计时组件元数据(设计时在VS中暴露出来的设置元数据)

6.3.System.ComponentModel.DataAnnotations UI层框架的通用数据注解组件

6.4.使用System.ComponentModel.DataAnnotations中的获取元数据设置特性功能

4.ModelMetadata(ModelMetadata元数据如何支撑Model与View之间的组合关系)

ModelMetadata是ASP.NETMVC中用来表示Model的元数据对象,它包含了一个Model的所有的相关元数据信息,当然这取决Model的使用方向,不同的使用方向会有不同类型的元数据,我们这里的ModelMetadata是针对View显示相关的元数据;ModelMetadata中绝大部分元数据是用来作为最终在View生成环节当中需要使用到的,比如:如何确定一个领域相关的属性(Address)该如何展现,这里的Address可能不是一个简单的String类型表示,而是由一组复杂的类型表示,这样的情况下我们就需要通过自定义元数据来控制最终使用的呈现模板(PartialView);


在MVC的定义中,Model准确意思是ViewModel(显示Model,只是用来作为界面呈现使用的数据实体),它是直接提供给View作为呈现使用的数据实体,通常情况下还将作为DTO类型的数据实体,负责数据的往返传输;ASP.NETMVC提供一种自定义Model呈现方式的接口,它允许我们通过自定义某个ViewModel中的属性显示视图(PartialView部分视图),从而可以对ViewModel进行非常细粒度的呈现控制,但是这一扩展机制的背后正是ModelMetadata的功劳;


ModelMetadata起到中间桥梁的作用,在桥梁的一端是ViewModel,另一端是View,然而我们可以在ViewModel上通过定义Attribute的方式进行元数据的自定义,可以通过改变某个ViewModel的ModelMetadata来操纵最终的呈现;

4.1.ModelMetadata元数据结构(元数据与数据实体的结构关系)

图1:Customer ViewModel

View Code

4.2.View与Model的基本关系及使用方式(View的呈现基础)

当我们有了一个ViewModel之后就可以在任何一个View中显示它,View的呈现是强类型的,也就是说必须具有一个实体的类型作为数据呈现容器的基础在View中引入,因为一系列的HtmlHelper扩展方法都是基于这个强类型,我们通过一个简单的示例,来大概的了解一下ASP.NETMVC使用方式;

Customer ViewModel 代码:

View Code

这是一个简单的以Customer为主的ViewModel,在Customer中定义了一个Shopping类型的属性,然后在Shopping类型中又定义了一个String类型的Address属性,这是一个很常用的嵌套对象结构;

HomePage Controller 代码:

View Code

控制器什么事情也没做,直接实例化了一个嵌套层次结构的Customer对象并初始化了一些测试数据,该Action使用ViewResult类型作为返回结果;

Index View 代码:

View Code

视图分别对Customer类型的嵌套属性进行了编辑、显示定义,这里需要说明的是EditorForModel()、DisplayForModel()不会做到对嵌套类型的编辑、显示,因为这不符合日常使用,我们需要明确的编码需要编辑、显示的属性,通过EditorFor()、DisplayFor()方法进行选择;

这是一个最基本的MVC使用方式,Customer是需要View进行显示的ViewModel,在View中通过HtmlHelper扩展方法对Customer实体生成编辑、显示时的所有HTML,这确实方便了很多,我们不需要去管到底如何生成这些HTML了;

图3:

View Code

图5:

View Code

这里通过Diaplay预定义特性来控制元数据显示选项,在Display特性中有很多可选属性用来进一步设置显示选项,这里我们只使用了Name属性来设置该属性在界面上显示的文本信息,用来替换原本显示代码属性名称的默认选项;

图6:

View Code

这是一个很简单的自定义元数据对象,当我们将CustomDisplayName 特性对象设置在指定的ViewModel中的任何一个属性上时,将可以在运行时获取到系统自动生成的元数据对象模型ModelMetadata,这个时候我们就可以对当前的元数据进行随意的控制,甚至可以一直追述元数据的所有关联元数据;

上面的示例代码将复写通过预定义特性Display特性设置的元数据信息DisplayName:

View Code

在CustomerId属性上我们设置了两个特性,一个是系统预定义的Display特性,该特性将会对元数据对象ModelMetadata的DisplayName属性进行设置,还有一个正是我们自定义的CustomDisplayName特性,在我们自定义特性的内部逻辑中,如果我们设置了CustomDisplayName对象的Name属性,那么我们将使用该值复写通过预定义特性Display特性所设置的默认元数据信息,从而达到控制最终元数据的目的;

图7:

View Code

通过使用AssociatedMetadataTypeTypeDescriptionProvider 公共关联类类型描述提供程序获取所有关联类的元数据控制声明;

图12:



我们可以使用System.ComponentModel.DataAnnotations命名空间提供的公共组件设计框架中提供的关于数据注解方面的功能来方便的开发有关元数据注解方面的程序特性;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐