mvc Model元数据【学习笔记】
页面中Html.Editorfor(model=>model.fieldname)这些方法,都是通过Model的元数据来生成html的,我们如果想控制最终生成的html,可以通过修改元数据来实现。
代表Model元数据的类名是ModelMetadata,获取一个Model类的元数据的方法如下:
public static ModelMetadata GetModelMetadata<TModel>(string propertyName)
{
ModelMetadataProvider provider = ModelMetadataProviders.Current;
ModelMetadata containerMetadata = new ModelMetadata(provider, null, () => null, typeof(TModel), null);
return containerMetadata.Properties.FirstOrDefault(m => m.PropertyName == propertyName);
}
ModelMetadata元数据类的TemplateHint可读写属性,代表生成的html模板(比如设置成"HiddenInput",就是一个hidden类型的<input/>),修改这个属性值的方法如下:
1、UIHintAttribute 特性
这个特性有两个只读属性PresentationLayer 、UIHint(在构造函数中赋值)。只要设置UIHint值,就等于设置了TemplateHint属性。
这个特性在相同的目标上可以应用多次,怎么确定选择使用哪个特性呢?选择步骤如下:首先查看特性的PresentationLayer属性如果等于"MVC"(应该是因为在MVC在的原因下,所以是"MVC"),就选择该特性,如果没有找到等于"MVC"的
就选择特性的PresentationLayer属性为空的特性,如果找到多个匹配的,就选择第一个找到的特性(反射获得的特性顺序和设置时的位置没有关系)
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple=true)]
public class UIHintAttribute : Attribute
{
//其他成员
public UIHintAttribute(string uiHint);
public UIHintAttribute(string uiHint, string presentationLayer);
public string PresentationLayer { get; }
public string UIHint { get; }
}
2、
HiddenInputAttribute特性,如果设置了这个特性,就会把UIHint属性的值设置为"HiddenInput"。如果同时设置UIHintAttribute和HiddenInputAttribute,则UIHintAttribute特性优先级高于HiddenInputAttribute
ScaffoldColumnAttribute特性,主要控制元数据中的ShowForDisplay 属性和ShowForEdit 属性。设置这个特性的scaffold属性,就相当于给元数据中的那两个属性赋值了。
元数据中的这两个属性到底有啥用呢?
public class ModelMetadata
{
//其他成员
public virtual bool ShowForDisplay { get; set; }
public virtual bool ShowForEdit { get; set; }
}
一个重要的接口IMetadataAware
实现IMetadataAware接口的特性类,可以获得一个ModelMetadata 类的实例,任意修改里面的属性。。。。。你懂得
public interface IMetadataAware
{
void OnMetadataCreated(ModelMetadata metadata);
}
DataTypeAttribute、DisplayFormatAttribute、EditableAttribute、ReadOnlyAttribute、DisplayAttribute、DisplayNameAttribute、RequiredAttribute 等等...
总结:mvc中定义了很多的控制元数据的特性,这些特性最终都是设置修改元数据的属性值。但是有很多的元数据属性,设置了没有效果。。。。难道这是用来给我们扩展用的未实现功能的属性标记吗?还是说是我测试的环境问题呢?我
的测试环境是 4.0 mvc3
mvc Model元数据【学习笔记】的更多相关文章
- ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...
- ASP.NET MVC Model元数据(四)
ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...
- ASP.NET MVC Model元数据(一)
ASP.NET MVC Model元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- ASP.NET MVC Model元数据(三)
ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...
- ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
- MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom
<MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...
- MVC缓存OutPutCache学习笔记 (一) 参数配置
OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
随机推荐
- 关于RGB转换YUV的探讨与实现
最近在Android手机上使用相机识别条形码工作取得了比较理想的进展,自动识别功能基本完成,然而在手动识别指定条形码图片时遇到困难,由于Zxing开源Jar包识别图片的颜色编码式为YUV,而普通的图片 ...
- ZBar只扫描二维码/条形码
You can add these codes for ImageScanner scanner.setConfig(0, Config.ENABLE, 0); //Disable all the S ...
- android 68 单元测试
package com.itheima.junit; import android.os.Bundle; import android.app.Activity; import android.vie ...
- sum() over() 函数的使用
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number(),sum()等一起使用. over函数的参数:over(partition by columnnam ...
- WPF加载Winform窗体时 报错:子控件不能为顶级窗体
一.wpf项目中引用WindowsFormsIntegration和System.Windows.Forms 二.Form1.Designer.cs 的 partial class Form1 设置为 ...
- scp文件到远端机器问题总结及解决方法
今天在download服务器日志时遇到了很多问题, 顺便把相应的解决步骤记录下方便以后查看. #把文件copy到192.168.1.102的服务器上 scp -r local_dir readonly ...
- angularjs 根据变量改变 动态加载模板
directive return { restrict: 'E', replace: true, templateUrl: 'app/view/order.html', link: function ...
- 推断类型var
1.为什么使用推断类型var var可以根据变量的初始值自动推断局部变量类型,当无法确定所用变量的具体类型时可使用var 2.如何使用推断类型var 客户端代码 static void Main(st ...
- 根据文件夹的GUid找到该文件夹
Guid guid = Guid.Parse(folderGuID); SPFolder folder = list.Folders[guid].Folder;
- (转)php连接mysql如何判断数据为空?
<?php$result_a=mysql_query("select * from product_tag where product_id=$row[id]");$num ...