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

  • 相关阅读:
    VS2008中影响exe大小的和速度的选项(转)
    Some VS2005 and VS2008 Wizards Pop Up Script Error(转)
    winform 界面控件更新(转)
    SQL 2005 的存储过程和触发器调试大法(转)
    c# 正则表达式(转)
    让国外邮件服务商不再拒收你的邮件,The IP you're using to send mail is not authorized(转)
    vs2010 修改标题的方法
    SetFilePointer 使用
    修复2003系统,html图表不正确的方法
    c#字符串及数组操作 (转)
  • 原文地址:https://www.cnblogs.com/darrenji/p/3755724.html
Copyright © 2011-2022 走看看