问题1:什么叫Model元数据?

  Model元数据,是针对数据类型的一种描述信息。由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此Model 元数据为树形结构:

  1. //namespace:System.Web.Mvc
  2. public class ModelMetadata
  3. {
  4. //其它成员
  5.  
  6. //当前模型类型
  7. //倘若用数据库中树形结构解释,这个属性相当于Id
  8. public Type ModelType { get; set; }
  9.  
  10. //当前模型类型所属类型
  11. //倘若用数据库中树形结构解释,这个属性相当于ParentId
  12. public Type CotainerType { get; set; }
  13.  
  14. }

  在ASP.NET MVC中对应被定义为类型 “ModelMetadata”,其作用主要体现在以下两个方面:

  1、控制数据类型本身及其成员属性在界面上的呈现方式;

  1. //namespace:System.Web.Mvc
  2. public class ModelMetadata
  3. {
  4. //其它成员
  5.  
  6. //模型名称
  7. public virtual string DisplayName { get; set; }
  8. }

  上面代码将MVC框架定义的Model元数据精简为一个属性,该属性用于呈现Model或者Model数据中元素在UI上的显示名称。这样说过于抽象,下面的的代码是我们在MVC程序开发时候常写写的界面模型类:

  1. //用户界面模型
  2. public class CustomerModel
  3. {
  4. [DisplayName("用户姓名")]
  5. public string Name{get;set;}
  6.  
  7. public string Gender{get;set;}
  8. }

  给CustomerModel的 Namei属性添加DisplayName 特性,Gender属性不做任何操作,倘若在强类型视图上使用@Html.DisplayFor(d=>d.Name);  @Html.DisplayFor(d=>d.Gender)显示用户信息,会发现Name会显示“用户姓名”,而Gender属性的显示仅仅是原样输出为Gender;

  事实上,DisplayName特性就是通过改变ModelMetadata的DisplayName来达到这一效果,也就是说,特性的作用在于定制ModelMetadata。

  2、Model绑定和验证提供必不可少的元数据

  绑定以后提及,至于验证,看下面代码:

  1. //namespace:System.Web.Mvc
  2. public class ModelMetadata
  3. {
  4. //其它成员
  5.  
  6. //是否必填
  7. public virtual bool IsRequired{ get; set; }
  8. }
  1. //用户界面模型
  2. public class CustomerModel
  3. {
  4. [Required]
  5. public string Name{get;set;}
  6.  
  7. public string Gender{get;set;}
  8. }

同理,Required特性定制了Model元数据中的IsRequired属性以达到针对模型的验证。


问题2:如何针对Model元数据进行定制?

  问题1中说明了ModelMetadata类的各属性控制了数据在UI中的呈现、验证、绑定。那么如何获取或设置ModelMetadata类的各属性呢?答案是使用特性【Attribute】。

  可以用于定制Model元数据的特性有如何:

  1、UIHintAttribute

  HtmlHelper定义了一系列模板方法,比如DisplayFor/Display、EditorFor/Editor,所谓模板方法,就是Model数据与HTML标签的封装。其效果类似于强类型的PartialView。

  UIHintAttribute特性的作用就在于为Model中的属性或者字段显示指定模板,当UI出现@Html.DisplayFor(d=>d.Name)语句,ASP.NET MVC将会用UIHintAttribute指定的模板展示Model数据。

  MVC有一套寻找模板的规则,默认吗没有指定模板情况下,MVC将从@DisplayFor(d=>d.Name)  lamba表达式中得到Name的数据类型,根据该数据类型在预定义的目录下去寻找不同的模板。而同一种数据类型模板,又可以分为编辑模板(EditorFor)、显示模板(DisplayFor)。倘若指定了一个具体的模板名称,ASP.NET MVC 会自动采用该模板来生成最终的HTML。而指定的模板通常按显示模式定义在EditorTemplates目录或DisplayTemplates目录下。这些目录可以存在于Views/Shared、Views/{ControllerName}下;

  可以做个测试。

  首先定义数据模型:

  

  1. public class CustomerModel
  2. {
  3. [UIHint("Name")]
  4. public string Name { get; set; }
  5.  
  6. public string Gender { get; set; }
  7. }

  通过UIHint特性指定了显示模板为“Name”;

  控制器中实例一个CustomerModel对象,并传递给视图View。

  1. public ActionResult Index()
  2. {
  3. CustomerModel model = new CustomerModel()
  4. {
  5. Name = "小李",
  6. Gender = "男"
  7. };
  8. return View(model);
  9. }

新建View如下:

  1. <body>
  2. <div>
  3. @Html.DisplayFor(d=>d.Name)<br />
  4. @Html.DisplayFor(d => d.Gender)
  5. </div>
  6. </body>
  7. </html>

主要Gender属性我们并没有指定显示模板,接着需要在DisplayTemplates目录下新建Name 视图:

  1. @model string
  2.  
  3. <h3 style="color:red;">我是自定义模板:@Html.TextBox(Model,Model)</h3>

 最终运行结果如下:

  

  

  APS.NET MVC预定义模板总共有这么几个:

 
模板名称 模板作用 模板说明
EmailAddress Emal地址呈现 仅具有显示模式
HiddenInput

显示模式下文本显示;

编辑模式下文本+一个隐藏的<inptu>

HiddenInput(DisplayValue=false)

时,显示模式、编辑模式显示文本均消失。

Html 将模型数据中包含的HTML原样呈现 仅限于显示模式,效果与Html.Raw()相同
Text与String                         ---- 显示模式下直接以文本的形式输出,编辑模式下对应一个单行文本框
MultilineText 多行文本(<input type="text"/>) 仅限于编辑模式
Password 密码框 仅限于编辑模式
Decimal 小数位统一化为两位小数 显示模式:文本;标记哦是:单行文本框
Boolean                        ---- 显示模式:一个checkbox,disabled=true;编辑模式:一个chekbox,加一个隐藏的checkbox,两者name相同,value相异
Colloection 集合数据呈现 ……………………
Object 备胎 找不到其它,最终就是它。根据元数据DisplayName生成一个<div>
     

  2.HiddenInputAttribute与ScaffoldColumnAttribute

  通过应用HiddenInputAttribute,该特性的目标对象以只读的形式显示出来,如果不希望显示,可以设置特性的DisplayValue为false([HiddenInput(DisplayValue=false)])。

  通过应用ScaffoldColumnAttribute,该特性的目标对象不会出现在最终生成的Html中,区别与HiddenInputAttribute,HiddenInputAttribute目标元素会以type=hidden的形式出现在最终生成的Html当中;

  3.DataTypeAttribute与DisplayFormatAttribute

  这里的DataTypeAttribute不同于CLR类型,而是通过系统定义的枚举类型:DataType来表示具有某种显示格式的数据类型。枚举DataType定义如下:

  

  1. // 摘要:
  2. // 表示与数据字段和参数关联的数据类型的枚举。
  3. public enum DataType
  4. {
  5. // 摘要:
  6. // 表示自定义的数据类型。
  7. Custom = ,
  8. //
  9. // 摘要:
  10. // 表示时间上的一刻,以日期和当天的时间表示。
  11. DateTime = ,
  12. //
  13. // 摘要:
  14. // 表示日期值。
  15. Date = ,
  16. //
  17. // 摘要:
  18. // 表示时间值。
  19. Time = ,
  20. //
  21. // 摘要:
  22. // 表示对象存在的一段连续时间。
  23. Duration = ,
  24. //
  25. // 摘要:
  26. // 表示电话号码值。
  27. PhoneNumber = ,
  28. //
  29. // 摘要:
  30. // 表示货币值。
  31. Currency = ,
  32. //
  33. // 摘要:
  34. // 表示所显示的文本。
  35. Text = ,
  36. //
  37. // 摘要:
  38. // 表示一个 HTML 文件。
  39. Html = ,
  40. //
  41. // 摘要:
  42. // 表示多行文本。
  43. MultilineText = ,
  44. //
  45. // 摘要:
  46. // 表示电子邮件地址。
  47. EmailAddress = ,
  48. //
  49. // 摘要:
  50. // 表示密码值。
  51. Password = ,
  52. //
  53. // 摘要:
  54. // 表示 URL 值。
  55. Url = ,
  56. //
  57. // 摘要:
  58. // 表示图像的 URL。
  59. ImageUrl = ,
  60. }

事实上,DataTypeAttribute是一个验证特性,MVC在数据绑定期间将会根据应用了DataTypeAttribute的目标元素验证。 

DisplayFormatAttribure用于控制目标元素的显示形式。

  4 其它

  EditableAttribute与ReadOnlyAttributr控制目标元素的可读写性,两者实质等同,同时出现的情况下,前者具有更高的优先级;

  DisplayAttribute与DisplayNameAttribute 为目标元素定义一些说明性文字。同时出现的情况下,前者具有更高的优先级;此外,由于DisplayAttribute设置的文字都是面向最终用户的,所以有必要对其斤西瓜本地化,所以该特性提供了ResourceType属性用于代表采用的资源文件类型。

  RequiredAttribute顾名思义,其将目标元素设置为必需的数据成员。

  

【笔记】ASP.NET MVC Model元数据的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. ASP.NET MVC Model元数据

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

  7. ASP.NET MVC Model绑定(一)

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  8. ASP.NET MVC Model绑定

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  9. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

随机推荐

  1. Windows 7/8/8.1 硬盘安装法实现 ubuntu 14.04 双系统

    一.软件准备 1. 下载 Ubuntu 系统镜像:http://www.ubuntu.com/download/desktop/ : 这里使用的是 ubuntu 14.04.1 LTS 64bit 版 ...

  2. HTTP状态

    HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应 ...

  3. WCF学习笔记(一)

    WCF是什么? 官方解释: Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至 ...

  4. 最新百度音乐api

    一直都想做网络音乐播放器,但是自己又没有服务器,根本就不能实现,也没那个能力实现.唯一的办法就是借助别人的API. 网上公布的API特别少,像能够直接得到音乐文件的真是地址的几乎没有,有的也只是截取流 ...

  5. mutex 简单介绍

    “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量. 当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源.M ...

  6. zookeeper典型应用场景之一:master选举

    对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用.于是,有了如下的 ...

  7. 【漫画解读】HDFS存储原理(转载)

    以简洁易懂的漫画形式讲解HDFS存储机制与运行原理. 一.角色出演 如上图所示,HDFS存储相关角色与功能如下: Client:客户端,系统使用者,调用HDFS API操作文件;与NN交互获取文件元数 ...

  8. JQ定义

    什么是jQuery对象 通过$(‘选择器’)获取到都是jQuery对象 什么是DOM对象 通过getElementById或者 getElementsByTagName或者getElementsByN ...

  9. 怎样使android的view动画循环弹动

    在res中建立文件夹anim,分别写下cycles.xml,shake1.xml,shake2.xml cycles.xml: <?xml version="1.0" enc ...

  10. C++primer 阅读点滴记录(二)

      智能指针(smart point)       除了增加功能外,其行为像普通指针一样. 一般通过使用计数(use count)或引用计数(reference count)实现智能指针,防止出现指针 ...