Выберите Specifi c Enum to EnumDropDownListFor для условия в ASP. NET MVC - PullRequest
0 голосов
/ 06 января 2020

У меня проблема, и я до сих пор не понимаю понятия о Enum in EnumDropDownListFor для привязки spesifi c Существующее значение 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
}

Я отобразил Перечислите в My View, используя EnumDropDownListFor

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

, и результат будет таким:

enter image description here

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

Ответы [ 2 ]

1 голос
/ 06 января 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.

1 голос
/ 06 января 2020

Модель:

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" })
...