• 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://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

  • 相关阅读:
    java Udp协议简单的通讯
    java 简单装饰设计模式
    java 简单的拷贝文件夹
    java 简单的文件操作
    java 简单的进水放水
    java 洗牌 发牌
    less的在线安装
    移动端缩放设置
    less.js插件监听
    less使用
  • 原文地址:https://www.cnblogs.com/QinQouShui/p/4349762.html
Copyright © 2020-2023  润新知