zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HTTPD之五---HTTP协议、相关工具及状态码
    HTTPD之四----实现HTTPD正向代理与反向代理
    第十三周---DNS原理、实现智能DNS及源码编译mariadb数据库
    DNS之五----实现智能DNS
    sqoop 导入增量数据到hive
    Hadoop 二次排序
    Spark foreachpartiton和mappartition的异同
    hadoop 实现多文件输出
    spark 实现多文件输出
    Scala 中 call by name & call by value 的区别
  • 原文地址:https://www.cnblogs.com/QinQouShui/p/4349762.html
Copyright © 2011-2022 走看看