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



  • 相关阅读:
    Maven关于web.xml中Servlet和Servlet映射的问题
    intellij idea的Maven项目运行报程序包找不到的错误
    修改Maven项目默认JDK版本
    刷题15. 3Sum
    刷题11. Container With Most Water
    刷题10. Regular Expression Matching
    刷题5. Longest Palindromic Substring
    刷题4. Median of Two Sorted Arrays
    刷题3. Longest Substring Without Repeating Characters
    刷题2. Add Two Numbers
  • 原文地址:https://www.cnblogs.com/lxiang/p/3904323.html
Copyright © 2011-2022 走看看