Как локализовать перечисление и использовать что-то похожее на Html.SelectListFor <T> - PullRequest
5 голосов
/ 15 декабря 2010

Допустим, я получил следующий класс и перечисление:

public class MyModel
{
    [DisplayName("Min egenskap")]
    public MyEnum TheProperty {get;set;}
}

public enum MyEnum
{
  [DisplayName("Inga från Sverige")]
  OneValue,

  [DisplayName("Ett annat värde")]
  AnotherValue
}

Приведенный выше код не работает, поскольку DisplayNameAttribute нельзя использовать для перечислений.Есть еще один атрибут, который можно использовать?

Что я хочу сделать, это сгенерировать красивый HTML-тег select, используя что-то вроде Html.SelectListFor(m => m.TheProperty).Список будет использовать атрибут DisplayNameAttribute или аналогичный при генерации.

Требуемый результат:

<select name="TheProperty">
<option value="OneValue">Inga från Sverige</option>
<option value="AnotherValue" selected="selected">Ett annat värde</option>
</select>

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

Пример того, как это сделать, - использовать атрибут [Description] в вашем перечислении:

public enum DaysOfWeek
{
    [Description("Monday")]
    Monday = 1,

    [Description("Tuesday")]
    Tuesday = 2
}

Затем создайте этот класс EnumerationHelper, который позволит вам получить атрибут Description вашего перечисления:

public static class EnumerationHelper
{
    //Transforms an enumeration description into a string 
    public static string Description<TEnum>(this TEnum enumObject)
    {
        Type type = enumObject.GetType();
        MemberInfo[] memInfo = type.GetMember(enumObject.ToString());

        if(memInfo != null && memInfo.Length > 0)
        {
            DescriptionAttribute[] attributes = (DescriptionAttribute[])memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Length > 0)
            {
                return attributes[0].Description;
            }
        }

        return enumObject.ToString();

    }
}

Затем вы можете запросить свой класс enum, чтобы получить значение и описание, а затем создать список SelectList. Вы должны ссылаться на EnumerationHelper в этом классе:

var listOfDaysOfWeek = (from DaysOfWeek d in Enum.GetValues(typeof(DaysOfWeek))
                        select new { ID = d, Description = d.Description() });

viewModel.selectListDaysOfWeek = new SelectList(listOfDaysOfWeek, "ID", "Description");

И, наконец, на ваш взгляд:

<%: Html.DropDownListFor(m => m.DayOfWeek, Model.DaysOfWeek) %>

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

3 голосов
/ 23 марта 2011

Я хотел отобразить Enum в представлении, поэтому я создал аналогичный Html помощник:

    /// <summary>
    /// Returns the [Description] value of a Enum member.
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="helper"></param>
    /// <param name="expression"></param>
    /// <returns></returns>
    public static MvcHtmlString DisplayEnumFor<TModel, TResult>(this HtmlHelper<TModel> helper, 
        Expression<Func<TModel, TResult>> expression) where TResult : struct {
        TResult value = expression.Compile().Invoke(helper.ViewData.Model);
        string propName = ExpressionHelper.GetExpressionText(expression);

        var description = typeof(TResult).GetMember(value.ToString())[0]
            .GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
        if (description != null) {
            return MvcHtmlString.Create((description as DescriptionAttribute).Description);
        }

        return MvcHtmlString.Create(value.ToString());
    }

Использование:

@Html.DisplayEnumFor(m => m.SomeEnumProperty)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...