Использование [Display (Name = "X")] с перечислением. Пользовательский HtmlHelper в MVC3 ASP.Net - PullRequest
10 голосов
/ 09 января 2012

Я использую фрагмент кода из другого вопроса 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());
        }
    }
}

Вдоль моего текущего enum:

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

Если я затем использую @html.RadioButtonForEnum(...) Он отображает мои перечисления с соответствующим флажком без проблем. Однако я хочу, чтобы они использовали значение метки [Display(Name = "<text>")], чтобы они имели больше смысла! - то есть не просто 0,1,2.

Ответы [ 3 ]

12 голосов
/ 09 января 2012

Вы можете использовать отражение, чтобы получить значение:

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());
}
0 голосов
/ 09 января 2012

Я использую [Description] в своем коде, но вы можете просто изменить это, чтобы использовать DisplayAttribute:

https://gist.github.com/1287511

0 голосов
/ 09 января 2012

Вероятно, вам нужен метод расширения для вашего перечисления, чтобы получить атрибут отображения, который вы указали в параметрах перечисления.Затем, когда вы получаете имя или значение вашего значения перечисления опций в методе RadioButtonForEnum, вы просто вызываете метод extensions для заполнения значения.

Я недавно написал сообщение в блоге на эту тему: http://joerijans.blogspot.com/2011/10/triple-door-extension-method-custom.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...