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
MVC MODEL Attribute 操纵速记的更多相关文章
- 理解Spring MVC Model Attribute和Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- 【译】理解Spring MVC Model Attribute 和 Session Attribute
作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...
- asp.net mvc model attribute and razor and form and jquery validate 完美结合
1.创建Model,添加标注. [Serializable] public class BaseUserModel:BaseModel { [StringLength(100)] [Required( ...
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...
- ASP.NET MVC Model元数据(四)
ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...
- ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
- ModelBinder——ASP.NET MVC Model绑定的核心
ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...
- ASP.NET MVC —— Model之一模型模板
http://www.cnblogs.com/lzhp/archive/2013/03/25/2981650.html Mvc model系列文章主要分为三部分:Model Templates,Mod ...
随机推荐
- ASP.NET Web API 创建帮助页
1. 安装 Microsoft.AspNet.WebApi.HelpPage 程序包 Install-Package Microsoft.AspNet.WebApi.HelpPage 2. 注册 Ar ...
- 使用Free Spire.Presentation生成PowerPoint文件
使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...
- 常见的几个meta标签元素
1.指定字符集: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/& ...
- Android 短信监听及用途分析
监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...
- Windows下程序打包发布时的小技巧
一.背景 Windows下开发的应用程序在发布时,需要将其依赖的一些动态链接库一起打进安装包里面去.这个时候,快速确定这个程序到底依赖哪些动态链接库变得非常重要.很久以前写过一篇关于Qt程序安装包制作 ...
- Visual Studio.NET单选题
在Visual Studio.NET窗口中,在__________窗口中可以察看当前项目的类和类型的层次信息. A. 解决方案资源管理器 B. 类视图 C. 资源视图 D. 属性 在线答题:http ...
- sqlHelper做增删改查
1.把数据库里面的数据显示出来 sqlHelper怎么用:[网上可以下载,需要可以找楼主要] 1.拷贝到项目,修改它的命名空间等于当前项目名称 2.数据库的连接信息,用户名,密码,登录方式等 < ...
- php 使用htmlspecialchars() 和strip_tags函数过滤HTML标签的区别
原文地址:http://www.manongjc.com/article/1103.html 先来看一下htmlspecialchars函数和strip_tags函数的使用实例: <?php $ ...
- php实现设计模式之 组合模式
<?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...
- 使用PowerDesigner设计建造MySQL数据库
使用PowerDesigner设计建造MySQL数据库 一.使用PowerDesigner制作建库脚本 1.设计CDM(Conceptual Data Model) 2.选择 Tools -> ...