c# – 使用[Display(Name =“X”)]和枚举. MVC3 ASP.Net中的自定义HtmlHelper

我使用另一个stackoverflow问题的一段代码
namespace MvcHtmlHelpers
{
    public static class htmlHelpers
    {
        /// <summary>
        /// Radio button for : Adapted to support enum labels from display attributes
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <typeparam name="TProperty"></typeparam>
        /// <param name="htmlHelper"></param>
        /// <param name="expression"></param>
        /// <returns></returns>
        public static MvcHtmlString RadioButtonForEnum<TModel,TProperty>(
            this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel,TProperty>> expression
        )
        {
            var MetaData = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData);
            var names = Enum.GetNames(MetaData.ModelType);
            var sb = new StringBuilder();
            foreach (var name in names)
            {
                var id = string.Format(
                    "{0}_{1}_{2}",htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,MetaData.PropertyName,name
                );

                var radio =  htmlHelper.RadioButtonFor(expression,name,new { id = id }).ToHtmlString();
                sb.AppendFormat(
                    "<label for=\"{0}\">{1}</label> {2}",id,HttpUtility.HtmlEncode(name),radio
                );
            }
            return MvcHtmlString.Create(sb.ToString());
        }
    }
}

沿着我目前的枚举:

public enum Options
    {
       [Display(Name ="Yes")]
        0,[Display(Name = "No")]
        1,[Display(Name = "Other")]
        2,}

如果我然后使用@ html.RadioButtonForEnum(…)它显示我的枚举与相应的框选择没有问题.但是,我希望他们使用标签值[Display(Name =“< text>”)],以使它们更有意义!即不仅仅是0,1,2.

解决方法

您可以使用反射来获取值:
public static MvcHtmlString RadioButtonForEnum<TModel,TProperty>(
    this HtmlHelper<TModel> htmlHelper,TProperty>> expression
)
{
    var MetaData = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData);

    var sb = new StringBuilder();
    var enumType = MetaData.ModelType;
    foreach (var field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))
    {
        var value = (int)field.GetValue(null);
        var name = Enum.GetName(enumType,value);
        var label = name;
        foreach (DisplayAttribute currAttr in field.GetCustomAttributes(typeof(DisplayAttribute),true))
        {
            label = currAttr.Name;
            break;
        }

        var id = string.Format(
            "{0}_{1}_{2}",name
        );
        var radio = htmlHelper.RadioButtonFor(expression,new { id = id }).ToHtmlString();
        sb.AppendFormat(
            "<label for=\"{0}\">{1}</label> {2}",HttpUtility.HtmlEncode(label),radio
        );
    }
    return MvcHtmlString.Create(sb.ToString());
}

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...