码迷,mamicode.com
首页 > Web开发 > 详细

MVC扩展DataAnnotationsModelMetadataProvider给model属性对应的页面元素添加任意属性和值

时间:2014-06-29 13:51:01      阅读:444      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   color   get   

比如,有这样一个类:

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

 

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

bubuko.com,布布扣

 

□ 思路

→自定义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中。

bubuko.com,布布扣

 

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

bubuko.com,布布扣
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("");
        }
    }
}
bubuko.com,布布扣

 

 

全局注册自定义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

MVC扩展DataAnnotationsModelMetadataProvider给model属性对应的页面元素添加任意属性和值,布布扣,bubuko.com

MVC扩展DataAnnotationsModelMetadataProvider给model属性对应的页面元素添加任意属性和值

标签:style   blog   http   java   color   get   

原文地址:http://www.cnblogs.com/darrenji/p/3755724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!