目的:

扩充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://stackoverflow.com/questions/3885796/get-displayname-attribute-without-using-labelfor-helper-in-asp-net-mvc

 

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 操纵速记的更多相关文章

  1. 理解Spring MVC Model Attribute和Session Attribute

    作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...

  2. 【译】理解Spring MVC Model Attribute 和 Session Attribute

    作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...

  3. asp.net mvc model attribute and razor and form and jquery validate 完美结合

    1.创建Model,添加标注. [Serializable] public class BaseUserModel:BaseModel { [StringLength(100)] [Required( ...

  4. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  5. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  6. ASP.NET MVC Model元数据(四)

    ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...

  7. ASP.NET MVC Model元数据(二)

    ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...

  8. ModelBinder——ASP.NET MVC Model绑定的核心

    ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...

  9. ASP.NET MVC —— Model之一模型模板

    http://www.cnblogs.com/lzhp/archive/2013/03/25/2981650.html Mvc model系列文章主要分为三部分:Model Templates,Mod ...

随机推荐

  1. 窥探Swift之别具一格的Struct和Class

    说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...

  2. HBase 数据模型(Data Model)

    HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...

  3. spring源码分析之spring-core-env

    看一下源码整体: 抓住主要点,Environment.PropertyResolver.PropertySource,其结构如下: 其中, Environment:Interface represen ...

  4. PHP类的原理

    一.类的实现 类的内部存储结构: struct _zend_class_entry { char type; // 类型:ZEND_INTERNAL_CLASS / ZEND_USER_CLASS c ...

  5. 設置Linux保留物理內存並使用 (1)

    在Linux系統中可以通過memblock來設置系統保留物理內存,防止這些內存被內存管理系統分配出去. 作者: 彭東林 郵箱: pengdonglin137@163.com 平臺 硬件平臺: TQ24 ...

  6. struts2学习笔记--上传单个和批量文件示例

    struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可. 单个文件上 ...

  7. $\LaTeX$笔记:Section 编号方式(数字、字母、罗马)&计数器计数形式修改

    $\LaTeX$系列根目录: Latex学习笔记-序 IEEE模板中Section的编号是罗马数字,要是改投其他刊物的话可能得用阿拉伯数字,所以可以在导言部分做如下修改(放在导言区宏包调用之后): \ ...

  8. ASP.NET MVC 使用 FluentScheduler 定时器计划任务

    MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...

  9. 9.Configure One-to-One(配置一对一关系)【Code-First系列】

    现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键[实际上是一对零或者一对一]. 请注意:一对一的关系,在MS SQL Server中,技术 ...

  10. 发布 Rafy 源码到 GitHub

      最近项目组开始使用 Git 来作为源码管理.我今天就顺便把 Rafy 的源码也迁移到了 github 上,方便大家使用.这是项目的地址:https://github.com/zgynhqf/raf ...