比如,有这样一个类:
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(this HtmlHelper html, Expression > 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)})
参考资料: