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

  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
    2020软件工程作业02
    软件工程作业01
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
  • 原文地址:https://www.cnblogs.com/darrenji/p/3755724.html
Copyright © 2011-2022 走看看