元数据这一词对于计算机科学来说不算陌生,对元数据的解释最简单的解释就是描述数据的数据,那么Model元数据当然是描述Model中各种成员的数据了,在ASP.NET MVC中ModelMetadata这个类专门用于描述Model及其成员的信息,这样就表明Model的描述需要一个ModelMetadata,Model里面的各个属性也需要ModelMetadata;换言之,ModelMetadata这个类有个自引用的现象,类的内部有个集合存储ModelMetadata。其声明如下

IEnumerable<ModelMetadata> Properties

这是ModelMetadata的一个成员,它的成员有很多,按现在的认识就分了两类,一种是包含上述属性的用于描述数据基本信息用的属性;一种是用于定制的属性,那部分包含定制信息的属性主要是用于呈现在View中或控制属性显示的模板。

  那么用于描述数据基本信息用的属性就有

类型

属性名

描述

Iemumerable<ModelMetadata>

Properties

属性成员的元数据集合

Type

ModelType

本身的类型

bool

IsComplexType

是否复杂类型

bool

IsNullableValueType

是否可空值

Type

ContainerType

父级类型

object

Model

本类的实例

string

PropertyName

在父类型中的属性名称

Dictionary<string,object>

AdditionalValue

存储自定义属性的字典集

ModelMetadataProvider

Provider

元数据的提供者

  在这个表中复杂类型这个词要稍作解释,其实也不算难,就是一个类型的值能通过字符串转换过来的就算是简单类型,反之则是复杂类型,例如整形(”1”),浮点型(”1.23”),日期(”2014-07-29”)等类型能通过字符串转换得到相应的(int,float,DateTime)类型的值,那么这个类型就算是简单类型,否则是复杂类型。

  另一部分用作定制的属性如下所示

类型 属性名 定制的Attribute 描述 备注
string TemplateHint HiddenInputAttribute UIHintAttribute 指定动态数据用来显示数据字段的模板或用户控件。 两个Attribute同时使用,后者具有更高的优先级
bool HideSurrounding   该特性用于指示是否应将属性值或字段值呈现为隐藏的 input 元素  
bool ShowForDisplay ScaffoldColumnAttribute   控制目标元素是否应该存在于基架之中  
bool ShowForEdit    
string DataTypeName DataTypeAttribute   指定要与数据字段关联的附加类型的名称。  
bool ConvertEmptyStringToNull DisplayFormatAttribute   指定 ASP.NET 动态数据如何显示数据字段以及如何设置数据字段的格式。  
string NullDisplayText    
string DisplayFormatString    
string EditFormatString    
bool IsReadOnly EditableAttribute ReadOnlyAttribute EditableAttribute:指示数据字段是否可编辑;
ReadOnlyAttribute:指定该特性所绑定到的属性是只读属性还是读/写属性。
两个Attribute同时使用,前者具有更高的优先级
string DisplayName DisplayAttribute DisplayNameAttribute 用于设置目标元素的显示名称 两者共同使用时,前者具有更高优先级
string ShowDisplayName   可以为实体分部类的类型和成员指定可本地化的字符串  
string Description    
int Order    
string watermark    
bool IsRequired RequiredAttribute   目标元素设置为是否必需的数据成员  

  Model模板则是利用Model元数据的定制信息来给HtmlHelper<TModel>的模板方法以特定的形式把数据以及元数据生成Html展示出来。那么这里的模板有框架里面预定义的模板,也可以由开发人员自己去定义的模板。下面则介绍预定义的模板。

  预定义模板主要使用的是UIHintAttribute来设置,如前面介绍元数据定制中所描述的:用于指定动态数据用来显示数据字段的模板或用户控件。下面还是以表格的形式展现各个预定义模板的使用还有结果。

模板名称 使用形式 结果
EmailAddress [UIHint("EmailAddress")]或者
[DataType(DataType.EmailAddress)]
DisplayFor:<a
href="mailto:foo@gmail.com">goo@gmail.com</a>
HiddenInput [UIHint("HiddenInput")] DisplayFor:1234567
    EditFor:<input id="Foo" name="Foo"
type="hidden" value="1234567"/>
Html [UIHint("Html")]或者
[DataType(DataType.Html)]
DisplayFor:<a href="www.google.com">google.com</a>
Text [UIHint("Text")]或者
[DataType(DataType.Text)]
DisplayFor:Admin
String [UIHint("String")] EditFor:<input class="text-box single-line"
id="Foo" name="Foo" type="text"
value="Admin"/>
Url [UIHint("Url")]或者
[DataType(DataType.Url)]
DisplayFor:<a
href="http://www.google.com">http://www.google.com</a>
MultilineText [UIHint("MultilineText")]或者
[DataType(DataType.MultilineText)]
EditFor:<textarea class="text-box multi-line"
id="Foo" name="Foo">Admin</textarea>
Password [UIHint("Password")]或者
[DataType(DataType.Password)]
EditFor:<input class="text-box single-line password"
id="Foo" name="Foo" type="password"
value=""/>
Decimal [UIHint("Decimal")] Display:123.00
    EditFor:<input class="text-box single-line" id="Foo" name="Foo"
type="text" value="123.00\"/>
Boolean [UIHint("Boolean")] Dislplay:<input id="Foo"
name="Foo" type="checkbox" value="true"
disable="true"/>
    EditFor:<input
id="Foo" name="Foo" type="checkbox"
value="true" disable="true"/>
<input name="Foo" type="hidden"
value="false"/>
Collection [UIHint("Collection")] Display:各元素的Display形式
    EditFor:各元素的Edit形式
Object [DisplayName("城市")] DisplayForModel:<div
class="display-label">城市</div>
<div class="display-field">佛山市</div>

  此时在一个以UserInfo类型为强类型的视图中调用@Html.DisplayForModel(),类的信息则会显示出来。但是若是UserInfo中的属性一定要是简单类型的;

  如果要给类中的某个成员定制模板,如给DateTime类型再定义一个MyDateTime模板

@model DateTime
时间是 @Model.ToString("yyyy-MM-dd HH:mm:ss")

然后给相应的成员使用上标记

[DataType(“MyDateTime”)]

则可。

  目前这部分内容还没学习完,经过后续的学习后会继续补充此文,由于还在学习,故会有理解得不恰当的地方,以上有什么说的不对的请指正,有什么好的建议或意见也请分享,谢谢!

Model元数据定制与Model模板的更多相关文章

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

    阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...

  2. MVC之Model元数据

    Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之. 在整个Action方法的执行过程中,Model元数据的解析是一个 ...

  3. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  4. ASP.NET MVC Model元数据(四)

    ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...

  5. ASP.NET MVC Model元数据(三)

    ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...

  6. ASP.NET MVC Model元数据(二)

    ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...

  7. ASP.NET MVC Model元数据(一)

    ASP.NET MVC Model元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...

  8. Model元数据提供机制小结

    在最开始先我得说说我看这部分的情况,最开始被各种ModelMetadata和各种ModelMetadataProvider给搞晕了,就几页书花了我好大的精力去看,直到后来看了一幅类图,细细看各个类之间 ...

  9. ASP.NET MVC Model元数据

    ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...

随机推荐

  1. 通过分析iframe和无阻塞脚本关系能让我们更懂iframe

    在我上篇文章里,我提到一种使用iframe完成无阻塞脚本加载的方式,因为我对iframe的偏见很大,所以上篇文章里我没有展开讨论这个问题. 文章发表后有位网友问了我这样一个问题,下面是他问题的原文,如 ...

  2. 远程调试Java程序

    java 可以以调试模式启动,启动后可以使用 jdb 对程序进行调试.以调试模式启动,需要加入以下参数: java -Xdebug -Xrunjdwp:transport=dt_socket,addr ...

  3. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  4. UWP 入门教程2——如何实现自适应用户界面

    系列文章 UWP入门教程1——UWP的前世今生 如上文所说的,布局面板根据可用的屏幕空间,指定界面元素的大小和位置.例如StackPanel 会水平或垂直排列界面元素.Grid 布局与CSS 中的表格 ...

  5. 关于QCon2015感想与反思

    QCon2015专场有不少关于架构优化.专项领域调优专题,但能系统性描述产品测试方向只有<携程无线App自动化测试实践>.   (一). 携程的无线App自动化     <携程无线A ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  7. VS 2008 生成操作中各个选项的差别

    近日,在编译C#项目时经常发现有些时候明明代码没错,但就是编译不过,只有选择重新编译或者清理再编译才会不出错,本着求学的态度,搜罗了下VS2008IDE中生成操作的种类以及差别,整理如下:   内容( ...

  8. 爱上MVC系列~过滤器实现对响应流的处理

    回到目录 MVC的过滤器相信大家都用过,一般用来作权限控制,因为它可以监视你的Action从进入到最后View的渲染,整个过程ActionFilter这个过滤器都参与了,而这给我们的开发带来了更多的好 ...

  9. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  10. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结

    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...