zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    定义enum,我用struct { enum Type{};};
    喧嚣中的iPad与iPhone
    [Architecture]zheye.org(者也)
    Driveworks Online Configurator
    [Buzz.Today]2012.05.02
    C++中的默认构造函数
    安装Ubuntu,尝尝鲜
    在cs文件中控制控件的 css样式。
    如何生成静态页面的五种方案
    在服务器上 .netFramework2.0 环境下,如何能在不改变服务器设置下,让站点能够运行 AJAX 程序
  • 原文地址:https://www.cnblogs.com/lxiang/p/3904323.html
Copyright © 2011-2022 走看看