页面中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元数据【学习笔记】的更多相关文章

  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元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...

  4. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  5. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

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

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

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

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

  8. MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom

    <MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...

  9. MVC缓存OutPutCache学习笔记 (一) 参数配置

    OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...

  10. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

随机推荐

  1. java基础入门-arraylist存储开销

    今天我们来看一下arraylist的存储开销,由于在项目其中,我尝试了一个很大的arraylist.然后内存爆了 所以我看了下源代码.原来arraylist的存储开销是比較大的,先上代码 import ...

  2. GDB的non-stop模式

    线程调试必杀技 - GDB的non-stop模式   作者:破砂锅 开源的GDB被广泛使用在Linux.OSX.Unix和各种嵌入式系统(例如手机),这次它又带给我们一个惊喜. 多线程调试之痛 调试器 ...

  3. LabVIEW设计模式系列——各种各样的状态机

  4. LAMP环境部署总结

    linux+apche+mysql+php 此次用到的工具有:/etc/init.d/iptables , selinux, useradd, yum,chkconfig,sshd,visudo,cr ...

  5. Android开发之View重写相关API-onLayout,onMeasure,MeasureSpec

     1.onLayout android.view.ViewGroup protected void onLayout(boolean changed, int l, int t, int r, int ...

  6. Android开发之手势滑动(滑动手势监听)详解

    Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...

  7. Android开发之Action Bar

    Action Bar代替了传统的位于设备屏幕的标题栏,主要用来显示应用程序的图标和活动的名称以及添加定制动作项等功能. 1. 显示和隐藏Action Bar 显示和隐藏Action Bar 一般有两种 ...

  8. UIWindow详解

    UIScreen(屏幕),UIWindow(窗口),UIView(视图)是iOS的几个基本界面元素.其中UIWindow(窗口)和UIView(视图)是为iPhone应用程序构造用户界面的可视组件.U ...

  9. IntelliJ插件安装

    1. 插件管理器在线安装 在IntelliJ插件管理页面([FileàSettingsàIDE SettingsàPlugins]),点击[Browse repositories-]按钮,在搜索框内输 ...

  10. winform windowsmediaplayer的属性

    首先将C:\WINDOWS\system32下的wmp.dll应用到项目中: WMPLib.WindowsMediaPlayerClass player = new WMPLib.WindowsMed ...