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://*.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

上一篇:gulp 入门指南


下一篇:java Switch中的case后面加上大括号({})和不加大括号的区别