架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 14291|回复: 2

[技巧] MVC 元模型元数据ViewData.ModelMetadata

[复制链接]
发表于 2017-6-28 21:12:49 | 显示全部楼层 |阅读模式

模型元数据ModelMetaData是MVC中很重要的概念,它包括但不仅限于 模型的类型,模型包含了哪些属性,属性都是什么类型的,属性上都有什么特性。

ASP.NET MVC3.0 提供了默认的模型元数据 DataAnnotationsModelMetadata 继承自ModelMetadata(另外系统提供了默认的模型元数据提供器DataAnnotationsModelMetadataProvider)

public class DataAnnotationsModelMetadata : ModelMetadata

它的构造函数如下

public DataAnnotationsModelMetadata(DataAnnotationsModelMetadataProvider provider, Type containerType, Func modelAccessor, Type modelType, string propertyName, DisplayColumnAttribute displayColumnAttribute);


DataAnnotationsModelMetadata类有常用的几个属性

DisplayName 显示名称,DisplayFormatString格式字符串

TemplateHint 获取一个值选择使用哪个模版


对于DisplayName ,LabelFor<TModel, TValue> 方法中使用此属性来生成标签文本.  意思就是一旦我们的model上有定义了DispalyName特性,那么view中使用html.editForModel()方法就会自动为model的这个属性显示出label标签"  <label for="username">名称</label></

  

[Display( Name="名称",Order=2)]   //order属性改变在html页面中的排列顺序
  public string username { get; set; }


021423543285832.png

html源代码:

  1. <div class="editor-label"><label for="username">名称</label></div>
  2. <div class="editor-field"><input class="text-box single-line" data-val="true" data-val-maxwords="名称 has too many words" data-val-maxwords-wordcount="2" data-val-required="名称 字段是必需的。" id="username" name="username" type="text" value=""> <span class="field-validation-valid" data-valmsg-for="username" data-valmsg-replace="true"></span></div>
复制代码



属性username上用的Display特性就是System.ComponentModel.DataAnnotations.DisplayAttribute类提供一个通用特性,使您可以为实体分部类的类型和成员指定可本地化的字符串


另外还有一些特性来自System.Web.MVC 和 System.ComponentModel.DataAnnotations,名称凡类似 XXXXAttribute的都为特性类,都有特定的使用范围,有的限制模型属性,有的限制Contrller,有的限制Action等等。


下面列举了这2个命名空间下,内置的而且常用的特性类

1)System.Web.MVC空间下的

AcceptVerbsAttribute,ActionFilterAttribute,ActionNameAttribute,AsyncTimeoutAttribute,AuthorizeAttribute,BindAttribute,

HiddenInputAttribute

ActionFilterAttribute  表示所有操作-筛选器特性的基类

HttpDeleteAttribute 类,表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP DELETE 请求

HttpGetAttribute,HttpPostAttribute 表示特性,用于限制操作方法,仅限处理PUT请求

HttpPutAttribute  表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP PUT 请求。


例:ActionNameAttribute 指定action的实际actionname,用法如下

[ActionName()]

public ActionResult  Index()


例:HiddenInputAttribute类,表示一个特性,该特性用于指示是否应将属性值或字段值呈现为隐藏 input 元素




上一篇:[A]MySql.Data.MySqlClient.MySqlConnection 无法强制转换为 [B]MySql.Data.MySqlC...
下一篇:Uncaught TypeError: Cannot set property 'unobtrusive' of undefined
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-6-28 21:14:05 | 显示全部楼层
ModelMetadata

  1. // 摘要:
  2.     //     为数据模型的公共元数据、System.Web.Mvc.ModelMetadataProvider 类和 System.Web.Mvc.ModelValidator
  3.     //     类提供容器。
  4.     public class ModelMetadata
  5.     {
  6.         // 摘要:
  7.         //     默认顺序值 10000。
  8.         public const int DefaultOrder = 10000;

  9.         // 摘要:
  10.         //     初始化 System.Web.Mvc.ModelMetadata 类的新实例。
  11.         //
  12.         // 参数:
  13.         //   provider:
  14.         //     提供程序。
  15.         //
  16.         //   containerType:
  17.         //     容器的类型。
  18.         //
  19.         //   modelAccessor:
  20.         //     模型访问器。
  21.         //
  22.         //   modelType:
  23.         //     模型的类型。
  24.         //
  25.         //   propertyName:
  26.         //     模型的名称。
  27.         public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName);

  28.         // 摘要:
  29.         //     获取包含有关模型的其他元数据的字典。
  30.         //
  31.         // 返回结果:
  32.         //     包含有关模型的其他元数据的字典。
  33.         public virtual Dictionary<string, object> AdditionalValues { get; }
  34.         //
  35.         // 摘要:
  36.         //     获取或设置模型的容器的类型。
  37.         //
  38.         // 返回结果:
  39.         //     模型的容器的类型。
  40.         public Type ContainerType { get; }
  41.         //
  42.         // 摘要:
  43.         //     获取或设置一个值,该值指示在窗体中回发的空字符串是否应转换为 null。
  44.         //
  45.         // 返回结果:
  46.         //     如果在窗体中回发的空字符串应转换为 null,则为 true;否则为 false。默认值为 true。
  47.         public virtual bool ConvertEmptyStringToNull { get; set; }
  48.         //
  49.         // 摘要:
  50.         //     获取或设置有关数据类型的元信息。
  51.         //
  52.         // 返回结果:
  53.         //     有关数据类型的元信息。
  54.         public virtual string DataTypeName { get; set; }
  55.         //
  56.         // 摘要:
  57.         //     获取或设置模型的说明。
  58.         //
  59.         // 返回结果:
  60.         //     模型的说明。默认值为 null。
  61.         public virtual string Descrip{过滤}tion { get; set; }
  62.         //
  63.         // 摘要:
  64.         //     获取或设置模型的显示格式字符串。
  65.         //
  66.         // 返回结果:
  67.         //     模型的显示格式字符串。
  68.         public virtual string DisplayFormatString { get; set; }
  69.         //
  70.         // 摘要:
  71.         //     获取或设置模型的显示名称。
  72.         //
  73.         // 返回结果:
  74.         //     模型的显示名称。
  75.         public virtual string DisplayName { get; set; }
  76.         //
  77.         // 摘要:
  78.         //     获取或设置模型的编辑格式字符串。
  79.         //
  80.         // 返回结果:
  81.         //     模型的编辑格式字符串。
  82.         public virtual string EditFormatString { get; set; }
  83.         //
  84.         // 摘要:
  85.         //     获取或设置一个值,该值指示是否应该使用关联的 HTML 元素呈现模型对象。
  86.         //
  87.         // 返回结果:
  88.         //     如果包含模型对象的关联 HTML 元素应包含在该对象中,则为 true;否则为 false。
  89.         public virtual bool HideSurroundingHtml { get; set; }
  90.         //
  91.         // 摘要:
  92.         //     获取或设置一个值,该值指示模型是否为复杂类型。
  93.         //
  94.         // 返回结果:
  95.         //     一个值,指示 MVC 框架是否将模型视为复杂类型。
  96.         public virtual bool IsComplexType { get; }
  97.         //
  98.         // 摘要:
  99.         //     获取一个值,该值指示类型是否可为 null。
  100.         //
  101.         // 返回结果:
  102.         //     如果该类型可为 null,则为 true;否则为 false。
  103.         public bool IsNullableValueType { get; }
  104.         //
  105.         // 摘要:
  106.         //     获取或设置一个值,该值指示模型是否为只读。
  107.         //
  108.         // 返回结果:
  109.         //     如果该模型为只读,则为 true;否则为 false。
  110.         public virtual bool IsReadOnly { get; set; }
  111.         //
  112.         // 摘要:
  113.         //     获取或设置一个值,该值指示模型是否为必需的。
  114.         //
  115.         // 返回结果:
  116.         //     如果该模型是必需的,则为 true;否则为 false。
  117.         public virtual bool IsRequired { get; set; }
  118.         //
  119.         // 摘要:
  120.         //     获取模型的值。
  121.         //
  122.         // 返回结果:
  123.         //     模型的值。有关 System.Web.Mvc.ModelMetadata 的更多信息,请参见 Brad Wilson 的博客上的文章 ASP.NET
  124.         //     MVC 2 Templates, Part 2: ModelMetadata
  125.         public object Model { get; set; }
  126.         //
  127.         // 摘要:
  128.         //     获取模型的类型。
  129.         //
  130.         // 返回结果:
  131.         //     模型的类型。
  132.         public Type ModelType { get; }
  133.         //
  134.         // 摘要:
  135.         //     获取或设置要为 null 值显示的字符串。
  136.         //
  137.         // 返回结果:
  138.         //     要为 null 值显示的字符串。
  139.         public virtual string NullDisplayText { get; set; }
  140.         //
  141.         // 摘要:
  142.         //     获取或设置一个值,该值表示当前元数据的顺序。
  143.         //
  144.         // 返回结果:
  145.         //     当前元数据的顺序值。
  146.         public virtual int Order { get; set; }
  147.         //
  148.         // 摘要:
  149.         //     获取模型元数据对象的集合,这些对象描述模型的属性。
  150.         //
  151.         // 返回结果:
  152.         //     用于描述模型属性的模型元数据对象的集合。
  153.         public virtual IEnumerable<ModelMetadata> Properties { get; }
  154.         //
  155.         // 摘要:
  156.         //     获取属性名称。
  157.         //
  158.         // 返回结果:
  159.         //     属性名称。
  160.         public string PropertyName { get; }
  161.         //
  162.         // 摘要:
  163.         //     获取或设置提供程序。
  164.         //
  165.         // 返回结果:
  166.         //     提供程序。
  167.         protected ModelMetadataProvider Provider { get; set; }
  168.         //
  169.         // 摘要:
  170.         //     获取或设置一个值,该值指示是否启用请求验证。
  171.         //
  172.         // 返回结果:
  173.         //     如果启用了请求验证,则为 true;否则为 false。
  174.         public virtual bool RequestValidationEnabled { get; set; }
  175.         //
  176.         // 摘要:
  177.         //     获取或设置短显示名称。
  178.         //
  179.         // 返回结果:
  180.         //     短显示名称。
  181.         public virtual string ShortDisplayName { get; set; }
  182.         //
  183.         // 摘要:
  184.         //     获取或设置一个值,该值指示属性是否应显示在只读视图(如列表和详细信息视图)中。
  185.         //
  186.         // 返回结果:
  187.         //     如果应在只读视图中显示模型,则为 true;否则为 false。
  188.         public virtual bool ShowForDisplay { get; set; }
  189.         //
  190.         // 摘要:
  191.         //     获取或设置一个值,该值指示是否应在可编辑视图中显示模型。
  192.         //
  193.         // 返回结果:
  194.         //     如果应在可编辑视图中显示模型,则为 true;否则为 false。
  195.         public virtual bool ShowForEdit { get; set; }
  196.         //
  197.         // 摘要:
  198.         //     获取或设置模型的简单显示字符串。
  199.         //
  200.         // 返回结果:
  201.         //     模型的简单显示字符串。
  202.         public virtual string SimpleDisplayText { get; set; }
  203.         //
  204.         // 摘要:
  205.         //     获取或设置一个提示,该提示建议要为此模型使用哪个模板。
  206.         //
  207.         // 返回结果:
  208.         //     一个提示,建议要为此模型使用哪个模板。
  209.         public virtual string TemplateHint { get; set; }
  210.         //
  211.         // 摘要:
  212.         //     获取或设置可用作水印的值。
  213.         //
  214.         // 返回结果:
  215.         //     水印。
  216.         public virtual string Watermark { get; set; }

  217.         // 摘要:
  218.         //     从模型的 System.Linq.Expressions.Expression 参数返回元数据。
  219.         //
  220.         // 参数:
  221.         //   expression:
  222.         //     一个标识模型的表达式。
  223.         //
  224.         //   viewData:
  225.         //     视图数据字典。
  226.         //
  227.         // 类型参数:
  228.         //   TParameter:
  229.         //     参数的类型。
  230.         //
  231.         //   TValue:
  232.         //     值的类型。
  233.         //
  234.         // 返回结果:
  235.         //     元数据。
  236.         public static ModelMetadata FromLambdaExpression<TParameter, TValue>(Expression<Func<TParameter, TValue>> expression, ViewDataDictionary<TParameter> viewData);
  237.         //
  238.         // 摘要:
  239.         //     从模型的表达式参数中获取元数据。
  240.         //
  241.         // 参数:
  242.         //   expression:
  243.         //     一个标识模型的表达式。
  244.         //
  245.         //   viewData:
  246.         //     视图数据字典。
  247.         //
  248.         // 返回结果:
  249.         //     模型的元数据。
  250.         public static ModelMetadata FromStringExpression(string expression, ViewDataDictionary viewData);
  251.         //
  252.         // 摘要:
  253.         //     获取模型的显示名称。
  254.         //
  255.         // 返回结果:
  256.         //     模型的显示名称。
  257.         public string GetDisplayName();
  258.         //
  259.         // 摘要:
  260.         //     返回模型的简单说明。
  261.         //
  262.         // 返回结果:
  263.         //     模型的简单说明。
  264.         protected virtual string GetSimpleDisplayText();
  265.         //
  266.         // 摘要:
  267.         //     获取模型的验证程序的列表。
  268.         //
  269.         // 参数:
  270.         //   context:
  271.         //     控制器上下文。
  272.         //
  273.         // 返回结果:
  274.         //     模型的验证程序的列表。
  275.         public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);
  276.     }
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-12-1 16:53:12 | 显示全部楼层
  1. internal virtual void RenderPartialInternal(string partialViewName, ViewDataDictionary viewData, object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
  2. {
  3.         if (string.IsNullOrEmpty(partialViewName))
  4.         {
  5.                 throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");
  6.         }
  7.         ViewDataDictionary viewData2;
  8.         if (model == null)
  9.         {
  10.                 if (viewData == null)
  11.                 {
  12.                         viewData2 = new ViewDataDictionary(this.ViewData);
  13.                 }
  14.                 else
  15.                 {
  16.                         viewData2 = new ViewDataDictionary(viewData);
  17.                 }
  18.         }
  19.         else if (viewData == null)
  20.         {
  21.                 viewData2 = new ViewDataDictionary(model);
  22.         }
  23.         else
  24.         {
  25.                 viewData2 = new ViewDataDictionary(viewData)
  26.                 {
  27.                         Model = model
  28.                 };
  29.         }
  30.         ViewContext viewContext = new ViewContext(this.ViewContext, this.ViewContext.View, viewData2, this.ViewContext.TempData, writer);
  31.         IView view = HtmlHelper.FindPartialView(viewContext, partialViewName, viewEngineCollection);
  32.         view.Render(viewContext, writer);
  33. }
复制代码


ViewData获取属性代码:

ViewDataDictionary viewData2=new ViewDataDictionary(ViewData["Test"]);
viewData2.ModelMetadata.Properties;
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-1-17 03:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表