阅读目录:
-
4.ModelMetadata(ModelMetadata元数据如何支撑Model与View之间的组合关系)
- 4.1.ModelMetadata元数据结构(元数据与数据实体的结构关系)
- 4.2.View与Model的基本关系及使用方式(View的呈现基础)
-
5.通过对ViewModel使用预定义Attribute设置ModelMetadata(扩展元数据设置IMetadataAware)
- 5.1.ViewModel的领域类型(类型的两个层面的含义,CLR类型、领域语言)
- 5.2.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
图2:Customer ModelMetadata
元数据的层次结构与所要表示的ViewModel的结构是一致的,比如上图中的Customer实体中有一个Shopping属性,该属性表示实体中的配送信息,然后Shopping中还包含一个Address属性表示配送地址,对应的ModelMetadata也是这种包含的层次结构,在每个ModelMetadata内部都有一个类型为IEnumerable<ModelMetadata>的Properties属性来引用它的下级ModelMetadata,这就形成了一个无限嵌套的元数据表示结构,在ModelMetadata通过下面两行代码来保存属性的这种嵌套依赖关系;
1 public class ModelMetadata { 2 3 public virtual IEnumerable<ModelMetadata> Properties {} /*类型的子对象元数据*/ 4 5 public string PropertyName {} /*所表示的属性名称*/ 6 7 }