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

比如,有这样一个类:

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

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

时间: 2024-10-22 11:02:42

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

给元素添加/设置属性、删除属性

给元素添加某属性或是设置元素的某属性,用setAttribute()方法,由元素调用,两个参数,第一个参数是属性名,字符串类型,第二个参数是属性值,任意类型. 如:var demo=document.getElementById("demo"); demo.setAttribute("time",Date.now()); 获取元素某属性,用getAttribute()方法,由元素调用,一个字符串类型参数,是属性名,可以获取元素本身已经有的属性,如class.id等,

读取页面元素的onclick属性值 禁止重定向 获取url重定向后Location头指定的重定向目标

(1) 读取页面元素的onclick属性值 html代码: <a id='linka' onclick="alert('ok');">链接</a> 取出item身上onclick属性的值:alert('ok'); 实现: IHTMLElement *item;// 已经找到该元素 CComQIPtr<IHTMLElement> spElem(item); VARIANT var; spElem->get_onclick(&var); C

javascript中用setAttribute给元素添加colspan属性无效

先附上代码 var tr=document.createElement('TR'); var td=document.createElement('TD'); td.setAttribute('colspan','9'); tr.appendChild(td); 我想为这个td设置上colspan属性值,但是发现页面上这个td虽然有colSpan='9'这个属性,但是却没有实现跨行的效果. 最后发现这个 'colspan' 属性要改成 'colSpan' 就是不能将s设置成小写的,我试验的浏览器

获取页面元素的css属性

function getStyle(obj, name){    if(obj.currentStyle)    {         return obj.currentStyle[name];//兼容ie版本    }   else   {        return getComputedStyle(obj, false)[name];//兼容FF和谷歌版本    }} 或者 function getStyle(obj,name){ return obj.currentStyle?obj.c

元素的className属性-修改类名

控制类名(className 属性): className 属性设置或返回元素的class 属性. 语法: object.className = classname 作用: 1.获取元素的class 属性 2. 为网页内的某个元素指定一个css样式来更改该元素的外观 看看下面代码,获得 <p> 元素的 class 属性和改变className: 结果:

元素节点的属性和方法

元素节点的属性 /* tagName innerHTML 双标签 value     单标签(input,textarea(虽然是双标签))既一般为表单标签 */ 节点属性只能获取行间样式 <script> /* tagName innerHTML 双标签 value 单标签(input,textarea(虽然是双标签))既一般为表单标签 */ window.onload = function(){ var oDiv = document.getElementById('div1'); //t

MVC使用AdditionalMetadata为Model属性添加额外信息

当需要为Model的属性添加一些额外信息的时候,使用[AdditionalMetadata("somekey", "some content")]是不错的选择,MVC内部把键值信息赋值给了ModelMetadata.AdditionalValues属性.那么,在视图中如何获取该属性的ModelMetadata呢? ModelMetadata提供的静态方法FromLambdaExpression()可以根据属性和ViewData获取到该属性的ModelMetadata

MVC 扩展 Html.ImageFor

Asp.Net MVC 扩展 Html.ImageFor 方法详解 背景: 在Asp.net MVC中定义模型的时候,DataType有DataType.ImageUrl这个类型,但htmlhelper却无法输出一个img,当用脚手架自动生成一些form或表格的时候,这些Url字段总是需要再手动改一次,特别是我想在img上面包裹一个a标签.并限定大小,比如: <a href="url" target="_blank"> <img src="

(转)MVC 3 数据验证 Model Validation 详解

继续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的数据验证Attribute来进行我们的数据验证.并且MVC 提供了客户端和服务器端 双层的验证,只有我们禁用了客