目的:
扩充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);
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