2017-01-04 2 views
0

У меня возникла проблема со ссылкой на мое перечисление с модели в виде индекса. Вот код моей модели:Ссылка на перечисление из модели в виде индекса

public enum UnitOfMeasure { 
    Item, 
    Kilogram, 
    Liter, } 

public class Product { 
    public Product() { 
     ProductOccurences = new List<ProductOccurence>(); } 

    [Key] 
    public int ProductId { get; set; } 
    public int ProductPhotoId { get; set; } 
    public UnitOfMeasure? UnitOfMeasure { get; set; } 
    public string ProductDescription { get; set; } 
    public virtual ProductPhoto Photo { get; set; } 
    public virtual ICollection<ProductOccurence> ProductOccurences { get; set; } } 

В Индексный У меня есть поля поиска для фильтрации конкретных результатов. Вы можете также искать для значения UnitOfMeasure (я использую @ Html.EnumDropDownListFor) - но я не могу обратиться непосредственно к полю перечислений из моей модели - потому что моя точка зрения сильно типизированный:

@model IEnumerable<Models.Product> 

Чтобы показать это поле значения выбора я использую трюк:

@Html.EnumDropDownListFor(model => model.FirstOrDefault().UnitOfMeasure, "Select unit of measure") 

, но это ужасно и некрасиво решение - также с нежелательным значением, загруженным по умолчанию. Что является самым элегантным способом решения этой проблемы в моей ситуации?

+0

Это не должно быть более отличается способ доступа 'ProductDescription', например. Выведенный фрагмент должен быть внутри '@foreach (элемент var в модели) {', поэтому вы просто игнорируете аргумент 'model' и используете' item', например. '@ Html.EnumDropDownListFor (model => item.UnitOfMeasure,« Выберите единицу измерения »)' –

ответ

0

Вы можете использовать EnumHelper так:

@Html.DropDownList("UnitOfMeasure", EnumHelper.GetSelectList(typeof(UnitOfMeasure))) 

ИЛИ

Вы можете сделать как это для сильно типизированной:

@{ // you can put the following in a back-end method and pass through ViewBag 
    var selectList = Enum.GetValues(typeof(UnitOfMeasure)) 
         .Cast<UnitOfMeasure>() 
         .Select(e => new SelectListItem 
          { 
           Value = ((int)e).ToString(), 
           Text = e.ToString() 
          }); 
} 
@Html.DropDownListFor(m => m.UnitOfMeasure, selectList) 
+0

Большое вам спасибо. Это именно то, чего я хочу. Я выбрал первый вариант, а также добавил третий аргумент - с текстом по умолчанию. – Mateo

Смежные вопросы