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

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

  //namespace:System.Web.Mvc
public class ModelMetadata
{
//其它成员 //当前模型类型
//倘若用数据库中树形结构解释,这个属性相当于Id
public Type ModelType { get; set; } //当前模型类型所属类型
//倘若用数据库中树形结构解释,这个属性相当于ParentId
public Type CotainerType { get; set; } }

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

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

 //namespace:System.Web.Mvc
public class ModelMetadata
{
//其它成员 //模型名称
public virtual string DisplayName { get; set; }
}

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

 //用户界面模型
public class CustomerModel
{
[DisplayName("用户姓名")]
public string Name{get;set;} public string Gender{get;set;}
}

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

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

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

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

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

同理,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}下;

  可以做个测试。

  首先定义数据模型:

  

  public class CustomerModel
{
[UIHint("Name")]
public string Name { get; set; } public string Gender { get; set; }
}

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

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

  public ActionResult Index()
{
CustomerModel model = new CustomerModel()
{
Name = "小李",
Gender = "男"
};
return View(model);
}

新建View如下:

 <body>
<div>
@Html.DisplayFor(d=>d.Name)<br />
@Html.DisplayFor(d => d.Gender)
</div>
</body>
</html>

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

@model string

  <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定义如下:

  

  // 摘要:
// 表示与数据字段和参数关联的数据类型的枚举。
public enum DataType
{
// 摘要:
// 表示自定义的数据类型。
Custom = ,
//
// 摘要:
// 表示时间上的一刻,以日期和当天的时间表示。
DateTime = ,
//
// 摘要:
// 表示日期值。
Date = ,
//
// 摘要:
// 表示时间值。
Time = ,
//
// 摘要:
// 表示对象存在的一段连续时间。
Duration = ,
//
// 摘要:
// 表示电话号码值。
PhoneNumber = ,
//
// 摘要:
// 表示货币值。
Currency = ,
//
// 摘要:
// 表示所显示的文本。
Text = ,
//
// 摘要:
// 表示一个 HTML 文件。
Html = ,
//
// 摘要:
// 表示多行文本。
MultilineText = ,
//
// 摘要:
// 表示电子邮件地址。
EmailAddress = ,
//
// 摘要:
// 表示密码值。
Password = ,
//
// 摘要:
// 表示 URL 值。
Url = ,
//
// 摘要:
// 表示图像的 URL。
ImageUrl = ,
}

事实上,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. .NET环境配置(二)

    打开IIS服务器   首先在设置程序池 应用程序池 设置  ASP.NET v4.0         ASP.NET v4.0 Classic CLassic.NET AppPool DefaultA ...

  2. 软件工程 speedsnail 第二次冲刺3

    20150520 完成任务:划线第三天,能画出一条直黄线且与蜗牛共存: 遇到问题: 问题1 碰撞检测有缺陷 解决1 没有解决 明日任务: 实现蜗牛与线的碰撞

  3. PHP和AJAX笔记汇总

    AJAX简介AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML)AJAX 是 Asynchronous JavaScript And ...

  4. ADO .NET 链接 增删改查

    ADO.NET: 数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中也可以将数据库中的数据提取到内存中供程序调用 所有数据访问技术的基础 连 ...

  5. C# app.config文件配置和修改

    很多时候我们需要对系统的.config文件进度读写操作,例如:系统初始化的参数的更改.系统参数的改变都需要更新到配置文件. 首先我们有必要了解一下app.config.exe.config和vshos ...

  6. SQLite开发工具

    Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 下载地址: http://w ...

  7. 【easyui】—easyui教你编写一个前台的架子

    以前做项目都是在别人搭建好的环境下直接编写单独的页面,也没有处理过怎么搭建一个框架.看到别人的布局都挺好的,自己也想做一个走一下流程. 嘿,刚开始时看着别人写的代码,去找怎么写. 这是我自己的想法,使 ...

  8. js给php传值

    //ajax传值 var str= JSON.stringify(arr1);//数组转string //alert(typeof(str)); $.ajax({ url:'test.php' ,ty ...

  9. MySQL性能优化笔记整理

    一.测试篇 1.测试目的,就是量化找出短板(基础参数配置) 2.测试三大指标 IOPS:每秒处理的IO请求数,即IO响应速度(注意和IO吞吐量的区别) QPS:每秒请求(查询)次数 TPS:每秒事务数 ...

  10. Learning Scrapy笔记(一)- Scrapy简单介绍

    Scrapy简述 Scrapy十一个健壮的,用来从互联网上抓取数据的web框架,Scrapy只需要一个配置文件就能组合各种组件和配置选项,并且Scrapy是基于事件(event-based)的架构,使 ...