博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC MODEL Attribute 操纵速记
阅读量:5149 次
发布时间:2019-06-13

本文共 4150 字,大约阅读时间需要 13 分钟。

目的:

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

}

}

}

 

 

 

参考:

 

 

转载于:https://www.cnblogs.com/QinQouShui/p/4349762.html

你可能感兴趣的文章
学习笔记--树链剖分
查看>>
设计模式《JAVA与模式》之访问者模式
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
《架构之美》阅读笔记六
查看>>
[BZOJ2667][cqoi2012]模拟工厂
查看>>
java EE设计模式--spring企业级开发最佳实践文摘
查看>>
实验6 数组一
查看>>
课堂作业05
查看>>
HTML基础2
查看>>
冒泡排序的两种实现
查看>>
boa web服务器
查看>>
将博客搬至CSDN
查看>>
AngularJS ng-model在ng-if里面无效
查看>>
今天2019年5月,21点58分
查看>>
JavaScript_几种创建对象(2017-07-04)
查看>>
类的初始化
查看>>
centos 7 install eclipse cdt and use github
查看>>
android自定义键盘光标不显示解决方法
查看>>
第一章 大型网站架构演化
查看>>
java基础<迷你DVD系统>
查看>>