您的位置:首页 > 其它

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

2014-05-27 19:01 531 查看
比如,有这样一个类:

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

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





□ 思路

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





扩展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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: