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