MVC MODEL Attribute 操纵速记
目的:
扩充Attribute
任意读取并Render 需要的Attribute
用法:
@Html.ParaLabelFor(x=>x.ServiceName):@Html.ParaNameFor(x
=>
x.ServiceName)
代码:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.Mvc;
namespace
CardLanPay
{
public
static
class
MyHtmlHelper
{
//public static System.Web.Mvc.MvcHtmlString DisplayParaName(this System.Web.Mvc.HtmlHelper helper, string paraName)
//{
// return System.Web.Mvc.MvcHtmlString.Create(Resources.AlipayParaNameResource.ResourceManager.GetString(paraName));
//}
public
static
System.Web.Mvc.MvcHtmlString
ParaNameFor<TModel, TValue>(this
System.Web.Mvc.HtmlHelper<TModel>
self, System.Linq.Expressions.Expression<Func<TModel, TValue>>
expression)
{
var
metadata
=
ModelMetadata.FromLambdaExpression(expression, self.ViewData);
var
PropertyName
=
metadata.PropertyName;
if (PropertyName
==
null)
return
MvcHtmlString.Create("");
switch (metadata.ContainerType.FullName)
{
case
"CardLanPay.Areas.Alipay.Models.BaseParaModel":
return
MvcHtmlString.Create(string.Format(@"<span>{0}</span>", Resources.AlipayParaNameResource.ResourceManager.GetString(PropertyName)));
default:
return
MvcHtmlString.Empty;
}
}
public
static
System.Web.Mvc.MvcHtmlString
ParaTextFor<TModel, TValue>(this
System.Web.Mvc.HtmlHelper<TModel>
self, System.Linq.Expressions.Expression<Func<TModel, TValue>>
expression)
{
var
metadata
=
ModelMetadata.FromLambdaExpression(expression, self.ViewData);
var
PropertyName
=
metadata.PropertyName;
if (PropertyName
==
null)
return
MvcHtmlString.Empty;
switch (metadata.ContainerType.FullName)
{
case
"CardLanPay.Areas.Alipay.Models.BaseParaModel":
return
MvcHtmlString.Create(string.Format(@"<span>{0}</span>", Resources.AlipayParaDisplayNameResource.ResourceManager.GetString(PropertyName)));
default:
return
MvcHtmlString.Empty;
}
}
public
static
System.Web.Mvc.MvcHtmlString
ParaLabelFor<TModel, TValue>(this
System.Web.Mvc.HtmlHelper<TModel>
self, System.Linq.Expressions.Expression<Func<TModel, TValue>>
expression)
{
var
metadata
=
ModelMetadata.FromLambdaExpression(expression, self.ViewData);
var
PropertyName
=
metadata.PropertyName;
if (PropertyName
==
null)
return
MvcHtmlString.Empty;
string
text
=
"";
switch (metadata.ContainerType.FullName)
{
case
"CardLanPay.Areas.Alipay.Models.BaseParaModel":
text
=
Resources.AlipayParaDisplayNameResource.ResourceManager.GetString(PropertyName);
break;
default:
break;
}
if (string.IsNullOrEmpty(text))
{
return
MvcHtmlString.Empty;
}
else
{
TagBuilder
tagBuilder
=
new
TagBuilder("label");
tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(PropertyName)));
tagBuilder.SetInnerText(text);
return
MvcHtmlString.Create(tagBuilder.ToString());
}
}
}
#region
属性元数据管理
public
abstract
class
MetadataAttribute : Attribute
{
public
abstract
void
Process(ModelMetadata
modelMetaData);
}
public
class
ParaNameModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected
override
ModelMetadata
CreateMetadata(
IEnumerable<Attribute>
attributes,
Type
containerType,
Func<object>
modelAccessor,
Type
modelType,
string
propertyName)
{
var
modelMetadata
=
base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
attributes.OfType<ParaNameAttribute>().ToList().ForEach(x
=>
x.Process(modelMetadata));
return
modelMetadata;
}
}
/// <summary>
/// 参数名特性类
/// </summary>
/// <remarks>
/// 用于给软件内部的属性指定支付宝接口使用的参数名
/// </remarks>
public
class
ParaNameAttribute : MetadataAttribute
{
private
readonly
string
paraName;
public
ParaNameAttribute(string
paraName)
{
this.paraName
=
paraName;
}
public
string
ParaName
{
get { return
paraName; }
}
public
override
void
Process(ModelMetadata
modelMetaData)
{
modelMetaData.AdditionalValues.Add("ParaName", Resources.AlipayParaNameResource.ResourceManager.GetString(ParaName));
}
}
#endregion
public
class
ParaTextAttribute : System.ComponentModel.DisplayNameAttribute
{
public
ParaTextAttribute(string
displayName)
{
DisplayNameValue
=
Resources.AlipayParaDisplayNameResource.ResourceManager.GetString(displayName);
}
}
}
参考:
http://blog.csdn.net/li_xiao_ming/article/details/10134177
http://www.cnblogs.com/wlitsoft/archive/2012/11/30/mvc-custom-htmlhelper.html
MVC MODEL Attribute 操纵速记的更多相关文章
- 理解Spring MVC Model Attribute和Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- 【译】理解Spring MVC Model Attribute 和 Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- asp.net mvc model attribute and razor and form and jquery validate 完美结合
1.创建Model,添加标注. [Serializable] public class BaseUserModel:BaseModel { [StringLength(100)] [Required( ...
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...
- ASP.NET MVC Model元数据(四)
ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...
- ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
- ModelBinder——ASP.NET MVC Model绑定的核心
ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...
- ASP.NET MVC —— Model之一模型模板
http://www.cnblogs.com/lzhp/archive/2013/03/25/2981650.html Mvc model系列文章主要分为三部分:Model Templates,Mod ...
随机推荐
- 使用Free Spire.XLS插入图表
使用Free Spire.XLS插入图表 前言 最近在研究Office中间件,上网搜索了下,比较出名的有两个:Aspose和Spire,两者功能齐全,对Office的支持趋近完善,但售价不菲.仔细搜索 ...
- Deque的部分成员函数 解析,关于这个类,百度有很多解析,唯独没有其函数介绍
函数 描述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的 ...
- C语言 第七章 数组与字符串
一.数组 1.1.数组的概念 用来存储一组相同类型数据的数据结构.有点像班上放手机的手机袋,超市的储物柜. 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. ...
- 奇妙的NULL值,你知道多少
<NULL值的多义性分析> 谈到NULL值,很多人都是很熟悉,但是深入了解后,又感觉到陌生,对其含义和用法,都无法很准确的理解.NULL在数据库和编程语言中,存在的意义和附带的含义不同. ...
- 基于DevExpress的Winform程序安装包的制作
在我们做系统开发的时候,都会面临一个安装包制作的问题,如何把我们做好的系统,通过安装包工具整合成一个安装包给客户进行安装.安装包的优势就是一步步安装就可以了,不用复制一大堆文件给客户,还怕缺少那个文件 ...
- SSH输入错误Action
在类型转化.输入验证校验 .文件上传等出错的时候,如Action中某个变量是int,而上传的值是"ABC",此时Action不会执行execute()函数,而是直接返回result ...
- ASP.NET MVC搭建项目后台UI框架—2、菜单特效
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- MongoDB索引
1.目的 索引就是用来加速查询的.数据库索引与书籍的索引类似:有了索引就不需要翻遍整本书,数据库则可以直接在索引中查找,使得查找速度能提高几个数量级.在索引中找到条目以后,就可以直接跳转到目标文档的位 ...
- GJM : 中断被Socket.Accept阻塞的线程
原帖地址:http://blog.csdn.net/kingfox/article/details/7233350 原文作者:狐帝 刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...
- Ext.NET MVC 配置问题总结
随着VS版本和.NET MVC版本.EF的版本的不断更新,虽然很多功能随着版本的提升而更完善,但对于旧版本开发的软件就有点悲催了,或许很多开发者都遇到类似的问题! 最近有一个项目是用.NET MVC3 ...