zoukankan      html  css  js  c++  java
  • MVC扩展DataAnnotationsModelMetadataProvider给model属性对应的页面元素添加任意属性和值

    比如,有这样一个类:

        public class User
        {
            public string Name { get; set; }
        }

    当在强类型视图页,显示属性Name对应的input元素,并想添加一个title属性和对应的值,如图:

    1

    □ 思路

    →自定义TooltipAttribute,可以打到Name属性上。
    →自定义DataAnnotationsModelMetadataProvider,把TooltipAttribute的Tooltip属性值放到放到ModelMetadata中,类型为key/value键值对的AdditionalValues属性中。
    →写一个HtmlHelper<TModel>的扩展方法,把ModelMetadata的AdditionalValues属性值取出来。

    把自定义特性TooltipAttribute打到属性上。

    using MvcApplication1.Extension;

    namespace MvcApplication1.Models
    {
        public class User
        {
            [Tooltip("请输入用户名")]
            public string Name { get; set; }
        }
    }

    自定义DataAnnotationsModelMetadataProvider,把自定义特性TooltipAttribute的Tooltip属性值放到ModelMetadata的AdditionalValues中。

    2

    扩展HtmlHelper<TModel>,先获取model相关的ModelMetadata,从ModelMetadata.AdditionalValues中键为Tooltip的值,即打在User的Name属性上[Tooltip("请输入用户名")]对应的input中title="请输入用户名"。

    using System.Linq.Expressions;
    
    namespace System.Web.Mvc
    {
        public static class TooltipExtension
        {
            public static MvcHtmlString TooltipFor<TModel, TValue>(this HtmlHelper<TModel> html,
                Expression<Func<TModel,TValue>> expression)
            {
                var modelMetadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
                if (modelMetadata.AdditionalValues.ContainsKey("Tooltip"))
                {
                    return new MvcHtmlString((string)modelMetadata.AdditionalValues["Tooltip"]);
                }
                return new MvcHtmlString("");
            }
        }
    }

    全局注册自定义DataAnnotationsModelMetadataProvider。

            protected void Application_Start()
            {
                ......

                ModelMetadataProviders.Current = new CustomModelMetadataProvider();
            }

    视图中:

    @model MvcApplication1.Models.User
    @Html.TextBoxFor(model => model.Name, new {title = @Html.TooltipFor(model => model.Name)})

    参考资料:
    Creating your own modelmetadataprovider to handle custom attributes

  • 相关阅读:
    JDK10源码阅读--String
    [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
    python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片
    读取数据库信息并生成表设计文档Word版本
    怀念那时正规的软件开发流程
    eclipse安装java web插件
    webAPI+angularJS文件上传和下载
    .net整理
    怎么向老板解释你工作的价值?
    JS高级代码
  • 原文地址:https://www.cnblogs.com/darrenji/p/3755724.html
Copyright © 2011-2022 走看看