Model 指ViewModel ,其作用:

  1. 用于目标Action的参数绑定
  2. 用于View呈现

Model元数据则是对ViewModel数据类型的描述,其作用在于控制作为Model的数据对象在View中的呈现方式,它使模板化的HTML呈现成为可能,此外它还服务于Model绑定和验证。

ModelMetadata对象

元数据的结构

用于描述Model元数据的是一个ModelMetadata对象,它具有层级结构

public class ModelMetadata
{
public object Container { get; set; }
// 模型的容器的类型。
public Type ContainerType { get; }
// 获取模型元数据对象的集合,这些对象描述模型的属性。
public virtual IEnumerable<ModelMetadata> Properties { get; }
//……其他成员
}

构造方法及类型、值、依赖关系等信息

public class ModelMetadata
{
public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName);
// 从模型的 Expression 参数返回元数据。
public static ModelMetadata FromLambdaExpression<TParameter, TValue>(Expression<Func<TParameter, TValue>> expression, ViewDataDictionary<TParameter> viewData);
// 从模型的表达式参数中获取元数据。
public static ModelMetadata FromStringExpression(string expression, ViewDataDictionary viewData); public const int DefaultOrder = 10000;
// 获取或设置一个值,该值表示当前元数据的顺序。
public virtual int Order { get; set; }
// 获取或设置提供程序。
protected ModelMetadataProvider Provider { get; set; }
// 获取或设置一个值,该值指示模型是否为复杂类型。
public virtual bool IsComplexType { get; }
// 获取模型的类型。
public Type ModelType { get; }
// 获取一个值,该值指示类型是否可为 null。
public bool IsNullableValueType { get; }
// 获取属性名称。
public string PropertyName { get; }
// 获取模型的值。
public object Model { get; set; }
// 获取包含有关模型的其他元数据的字典。
public virtual Dictionary<string, object> AdditionalValues { get; }
// Returns the simple description of the model.
protected virtual string GetSimpleDisplayText();
// 获取或设置模型的说明。
public virtual string Description { get; set; } //……其他成员
}
  • ModelType表示Model自身的数据类型,IsNullableValueType和IsComplexType分别表示它是否一个可空值类型和复杂类型
  • PropertyName: 表示对应的属性名,作为根节点的ModelMetadata对象该属性总是返回null
  • AdditionalValues用于存储一些自定义的属性,字典中的key和value分别表述自定义属性的名称和值,通过AdditionalMetadataAttribute来添加自定义属性。

IsComplexType属性

IsComplexType属性判断被描述数据是否复杂类型的条件是:它是否支持资源字符串的类型转换。依照这个标准,所有基元类型和可空值类型都是简单类型。而一个自定义类型默认是一个复杂类型,但可以为它应用一个TypeConverterAttribute特性并指定一个支持字符串转换的TypeConvert类型,则可以将其转变为一个简单类型。

[TypeConverter(typeof(PointTypeConverter))]
public class Point
{
public double X { get; set; }
public double Y { get; set; } public static Point Parse(string val)
{
//……
return new Point();
}
}
public class PointTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
} public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
return Point.Parse(value as string);
}
return base.ConvertFrom(context, culture, value);
}
}

元数据的定制

ASP.NET MVC通过应用在数据类型或其属性成员上的数据注解特性(主要定义在using System.ComponentModel.DataAnnotations.dll中)来定制描述目标类型或数据成员的Model元数据。

public class ModelMetadata
{
// 获取或设置模型的显示格式字符串。
public virtual string DisplayFormatString { get; set; }
// 获取或设置模型的编辑格式字符串。
public virtual string EditFormatString { get; set; }
// 获取或设置模型的显示名称。
public virtual string DisplayName { get; set; }
// 获取模型的显示名称。
public string GetDisplayName();
// 获取或设置短显示名称。
public virtual string ShortDisplayName { get; set; }
// 获取或设置要为 null 值显示的字符串。
public virtual string NullDisplayText { get; set; }
// 获取或设置一个值,该值指示是否应该使用关联的 HTML 元素呈现模型对象。
public virtual bool HideSurroundingHtml { get; set; }
public virtual bool HtmlEncode { get; set; }
// 获取或设置一个值,该值指示属性是否应显示在只读视图(如列表和详细信息视图)中。
public virtual bool ShowForDisplay { get; set; }
// 获取或设置一个值,该值指示是否应在可编辑视图中显示模型。
public virtual bool ShowForEdit { get; set; }
// 获取或设置模型的简单显示字符串。
public virtual string SimpleDisplayText { get; set; }
// 获取或设置一个提示,该提示建议要为此模型使用哪个模板。
public virtual string TemplateHint { get; set; }
// 获取或设置可用作水印的值。
public virtual string Watermark { get; set; } // 获取或设置一个值,该值指示是否启用请求验证。
public virtual bool RequestValidationEnabled { get; set; }
// 获取或设置一个值,该值指示模型是否为只读。
public virtual bool IsReadOnly { get; set; }
// 获取或设置一个值,该值指示模型是否为必需的。
public virtual bool IsRequired { get; set; }
// 获取或设置有关数据类型的元信息。
public virtual string DataTypeName { get; set; }
// 获取模型的验证程序的列表。
public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context); // 获取或设置一个值,该值指示在窗体中回发的空字符串是否应转换为 null。
public virtual bool ConvertEmptyStringToNull { get; set; }
}

UIHintAttribute

Model元数据决定了对应数据对象在View中的默认程序方式。在HtmlHelper和HtmlHelper<TModel>中定义了一系列模版方法,如Display/DispalyFor、Editor/EditorFor、DisplayForModel/EditForModel、Label/LabelFor、DisplayText/DisplayTextFor等。当我们调用这些方法将指定数据程序到View中的时候,并不对最终呈现的Html做具体控制,而是利用默认或指定的模版来决定呈现在浏览器中的Html。

每个模版都具有一个确定的名称,ModelMetadata的TemplateHint属性返回默认采用的模版名称,可通过UIHintAttribute属性定制。

如果多个UIHintAttribute被应用到同一个成员上,Asp.net mvc会优先选择PresentationLayer属性为mvc的那个,如果这样的UIHintAttribute不存在,则第一个PresentationLayer属性为空的会被选中。

Asp.Net MVC<七>:Model的更多相关文章

  1. 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面

    在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...

  2. Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute

    上篇文章中分析了Custom Binder的弊端: 由于Custom Binder是和具体的类型相关,比如指定类型A由我们的Custom Binder解析,那么导致系统运行中的所有Action的访问参 ...

  3. Asp.net MVC的Model Binder工作流程以及扩展方法(1) - Custom Model Binder

    在Asp.net MVC中, Model Binder是生命周期中的一个非常重要的部分.搞清楚Model Binder的流程,能够帮助理解Model Binder的背后发生了什么.同时该系列文章会列举 ...

  4. [转]ASP.NET MVC 2: Model Validation

    本文转自:http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx?CommentPo ...

  5. ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】

    今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...

  6. Asp.net MVC的Model Binder工作流程以及扩展方法(1)

    Asp.net MVC的Model Binder工作流程以及扩展方法(1)2014-03-19 08:02 by JustRun, 523 阅读, 4 评论, 收藏, 编辑 在Asp.net MVC中 ...

  7. ASP.NET MVC 之Model的呈现

    ASP.NET MVC 之Model的呈现(仅此一文系列三) 本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class H ...

  8. 区别:ASP.NET MVC的Model、DTO、Command

    最近在用CQRS架构模式做项目,有些感悟,记录下来. 问题的描述(大家是否也存在过类似的情况呢?): 从刚开始时项目中没有区分这3种对象,所以导致了很多职责公用,然后就乱了,比如Command一部分职 ...

  9. ASP.NET MVC传递Model到视图的多种方式总结

    ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel T ...

  10. ASP.NET MVC传递Model到视图的多种方式之通用方式的使用

    ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...

随机推荐

  1. Java—字符串小结

    最近工作中用到了大量有关字符串截取的知识,在此做出总结,希望需要的朋友带来帮助:  可以复制粘贴代码直接在java中测试1.将字符串中的指定字符":","-"删 ...

  2. 【Swift 2.1】为 UIView 添加点击事件和点击效果

    前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园: ...

  3. footer置底

    html代码: <div class="container"> <div cass="header"></div> < ...

  4. 使用xhprof分析php代码性能

    推荐在Linux平台使用xhprof,win下xhprof目前稳定版本在php5.5 安装xhprof 下载地址 http://pecl.php.net/get/xhprof-0.9.4.tgz 与p ...

  5. PHP服务缓存优化之ZendOpcache、xcache、eAccelerator

    PHP服务缓存优化原理 Nginx 根据扩展名或者过滤规则将PHP程序请求传递给解析PHP的FCGI,也就是php-fpm进程 缓存操作码(opcode) Opcode,PHP编译后的中间文件,缓存给 ...

  6. SQL Server 2000:快速清除日志文件的方法

    通过文章 SQL Server中“数据收缩”详解 和 SQLServer删除log文件和清空日志的方法 可以整理出一种快速删除数据库日志的方法,即 第一步:清空日志文件里的数据: 第二步:收缩日志文件 ...

  7. YARN基本框架介绍

    YARN基本框架介绍 转载请注明出处:http://www.cnblogs.com/BYRans/ 在之前的博客<YARN与MRv1的对比>中介绍了YARN对Hadoop 1.0的完善.本 ...

  8. JS导出PDF插件(支持中文、图片使用路径)

    在WEB上想做一个导出PDF的功能,发现jsPDF比较多人推荐,遗憾的是不支持中文,最后找到pdfmake,很好地解决了此问题.它的效果可以先到http://pdfmake.org/playgroun ...

  9. OpenStack中Keystone的基本概念理解

    原文http://www.kankanews.com/ICkengine/archives/10788.shtml Keystone简介 Keystone(OpenStack Identity Ser ...

  10. [转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    本文转自:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临两 ...