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



原文地址:https://www.cnblogs.com/lxiang/p/3904323.html