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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗