Выберите конкретное перечисление для EnumDropDownListFor на основе условия в ASP.NET MVC

У меня проблема, и я до сих пор не понимаю концепцию Enum в EnumDropDownListFor для привязки определенного значения Existing Enum.

public class LeaveRequestModel
{
    public int LeaveId { get; set; }
    public string LeaveCode { get; set; }
    public string Reason { get; set; }
    public LeaveStatus Status { get; set; } 
}
public enum LeaveStatus
{
    [Display(Name = "New Request")]
    NewRequest = 1,
    [Display(Name = "Approved by SPV")]
    ApprovedBySpv = 2,
    [Display(Name = "Approved by HR")]
    ApprovedByHr = 3,
    [Display(Name = "Rejected By SPV")]
    RejectedBySpv = 4
}

Я отобразил Enum в моем представлении, используя EnumDropDownListFor

@Html.EnumDropDownListFor(m => m.Status, "-Please select-", new { @class = "col-sm-10", @required = "required" })

и результат такой:

введите здесь описание изображения

Мой вопрос: как я могу отображать только определенные значения Enum ApprovedBySpv и ApprovedByHr в EnumDropDownListFor с определенным условием? Если возможно, как мне это сделать?


person aminvincent    schedule 06.01.2020    source источник
comment
Вы проверяли эти ответы? stackoverflow.com/ questions / 27133014 /   -  person Andrew    schedule 06.01.2020
comment
Можно ли скрыть их в браузере? Может, это более простой подход.   -  person Andrew    schedule 06.01.2020


Ответы (2)


Модель:

public class LeaveRequestModel
{
    ...
    public LeaveStatus Status { get; set; }
    public SelectList FilteredLeaveStatus {get;set;}
}

Контроллер:

public ActionResult LeaveRequest()
{
  var model = new LeaveRequestModel();

  if(condition)
  {
      var filtered = new[]
      {
          new SelectListItem{Value = LeaveStatus.ApprovedBySpv, Text = "Rejected By SPV"},
          new SelectListItem{Value = LeaveStatus.ApprovedByHr, Text = "Approved by HR"}
      };
    model.FilteredLeaveStatus = new SelectList(filtered);
  }
  ...
  return View(model);
}

Вид:

@Html.DropDownListFor(m => m.Status, Model.FilteredLeaveStatus, "-Please select-", new { @class = "col-sm-10", @required = "required" })
person mxmissile    schedule 06.01.2020
comment
Это работает, но не использует атрибуты отображаемого имени перечисления. - person Andrew; 06.01.2020
comment
Обновлен одним способом: вы можете установить Textvalue или вы можете получить значение атрибута динамически с помощью отражения типа. - person mxmissile; 06.01.2020

Вы можете добавить в класс метод, который будет принимать значения, определяющие условие, и возвращать только соответствующие перечисления. Например, предположим, что можно только повысить статус до более высокого статуса, но не вернуть его к более низкому статусу. Вы можете добавить метод, который будет принимать текущий статус и возвращать только статусы с более высоким значением.

Метод (добавить в LeaveRequestModel класс)

public IEnumerable<LeaveStatus> GetAvailableStatuses(){
    return Enum.GetValues(typeof(LeaveStatus)).Where(e => e >= Status);
}

Просмотр

@Html.EnumDropDownListFor(m => m.LeaveStatus, Model.GetAvailableStatuses().Select(s => new SelectListItem {
    Text = s.ToString(),
    Value = ((int)s).ToString()
}).ToList(), "-Please select-", new { @class = "col-sm-10", @required = "required" })

Обратите внимание, что я предполагал, в каком состоянии может быть ваше состояние, но вы можете обновить его с помощью метода GetAvailableStatuses.

person Aliza Berger    schedule 06.01.2020
comment
Никакая EnumDropDownListFor перегрузка не требует SelectList. - person mxmissile; 06.01.2020