【问题标题】:Using [Display(Name = "X")] with an enum. Custom HtmlHelper in MVC3 ASP.Net将 [Display(Name = "X")] 与枚举一起使用。 MVC3 ASP.Net 中的自定义 HtmlHelper
【发布时间】:2012-02-06 03:20:36
【问题描述】:

我正在使用另一个 stackoverflow 问题的 sn-p 代码:

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());
        }
    }
}

除了我现在的enum

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

如果我然后使用@html.RadioButtonForEnum(...) 它会显示我的枚举并选择适当的框没问题。但是,我希望他们使用标签值[Display(Name = "&lt;text&gt;")],这样他们就更有意义了! - 即不仅仅是 0,1,2。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 enums


    【解决方案1】:

    您可以使用反射来获取值:

    public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, 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}",
                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(label),
                radio
            );
        }
        return MvcHtmlString.Create(sb.ToString());
    }
    

    【讨论】:

    • 这是一种享受,不幸的是我不再获得自动选择的值了:@Html.RadioButtonForEnum(m =&gt; m.Options)
    • @RawryLions,对,我已经更新了我的答案来解决这个问题。它现在应该可以按预期工作了。
    • 很棒的东西,感谢您的帮助。我现在也可以以此为基础为其他表单元素创建枚举:)
    【解决方案2】:

    我在我的代码中使用[Description],但您可以简单地将其更改为使用DisplayAttribute

    https://gist.github.com/1287511

    【讨论】:

      【解决方案3】:

      您可能需要一个枚举扩展方法来获取您放在枚举选项上的显示属性。 然后,当您在 RadioButtonForEnum 方法中获取选项枚举值的名称或值时,您只需调用扩展方法来填充该值。

      我最近写了一篇关于这个话题的博文:http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2014-10-23
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多