EnumDropdownListFor включает имя перечисления в качестве опции - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующее перечисление:

public enum EventType : int
{
    [Display(Description = "Downtime")]
    Downtime = 0,
    [Display(Description = "Speed")]
    Speed = 1,
    [Display(Description = "Quality")]
    Quality = 2
}

Я создаю раскрывающийся список для него, используя:

@Html.EnumDropDownListFor(m => m.Type, "Event Type", new { @class = "form-control" })

Опции, которые я получаю в раскрывающемся списке:

  1. Тип события
  2. Время простоя
  3. Скорость
  4. Качество

Почему на земле равно Event Typeопция?И какое возможное значение оно может представлять ??

Атрибуты [Display] - моя слабая попытка исправить это ...

Есть идеи?

1 Ответ

0 голосов
/ 23 мая 2018

Сначала вам нужно создать расширение HTML Helper, например:

 public static class HtmlHelperExtensions
{       
    private static string GetDisplayName(this Enum enumeration)
    {
        var enumType = enumeration.GetType();
        var enumName = Enum.GetName(enumType, enumeration);
        var member = enumType.GetMember(enumName)[0];

            var attributes = member.GetCustomAttributes(typeof(DisplayAttribute), false);
            var attribute = (DisplayAttribute)attributes[0];
            var displayName = attribute.Name;

            if (attribute.ResourceType != null)
            {
                displayName = attribute.GetName();
            }

        return displayName;
    }


    public static MvcHtmlString EnumDropDownFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, Func<TEnum, bool> predicate=null, string optionLabel=null, object htmlAttributes=null) where TEnum : struct, IConvertible
    {
        var enumList = predicate == null ? Enum.GetValues(typeof(TEnum))
            .Cast<TEnum>()
            : Enum.GetValues(typeof(TEnum))
                .Cast<TEnum>()
                .Where(e => predicate(e));

        var selectList = enumList
            .Select(e => new SelectListItem
            {
                Value = Convert.ToUInt64(e).ToString(),
                Text = ((Enum)(object)e).GetDisplayName(),
            }).ToList();
        if (!string.IsNullOrEmpty(optionLabel))
        {
            selectList.Insert(0, new SelectListItem
            {
                Text = optionLabel
            });
        }

        return htmlAttributes==null 
            ? htmlHelper.DropDownListFor(expression, selectList) 
            : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);
    }
}

Затем, если ваш Enum как ниже

public enum EventType
{
    [Display(Description = "Downtime")]
    Downtime = 0,
    [Display(Description = "Speed")]
    Speed = 1,
    [Display(Description = "Quality")]
    Quality = 2
    [Display(Description = "Test")]
    Test = 3
}

, и вы не хотите загружатьTest затем используйте:

@Html.EnumDropDownFor(model => model.Type, types => types != EventType.Test, "Event Type", new {@class = "form-control"})

Или, если вам нужно загрузить все, то:

@Html.EnumDropDownFor(model => model.Type, optionLabel:"Event Type", htmlAttributes:new {@class = "form-control"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...