【问题标题】:Select Specific Enum to EnumDropDownListFor based on Condition in ASP.NET MVC根据 ASP.NET MVC 中的条件选择特定枚举到 EnumDropDownListFor
【发布时间】:2020-01-06 17:52:01
【问题描述】:

EnumDropDownListFor中关于Enum的概念有问题,仍然不理解绑定特定的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
}

我使用 EnumDropDownListFor 在我的视图中显示 Enum

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

结果是这样的:

我的问题是如何在特定条件下在 EnumDropDownListFor 中仅显示特定枚举值 ApprovedBySpvApprovedByHr?如果有可能,我该怎么做?

【问题讨论】:

标签: c# asp.net-mvc enums enumdropdownlistfor


【解决方案1】:

型号:

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

【讨论】:

  • 可行,但不使用枚举的显示名称属性。
  • 更新了一种设置Text值的方法,或者你可以使用类型反射动态拉取属性值。
【解决方案2】:

您可以向类添加一个方法,该方法将接收确定条件的值,并且只返回相关的枚举。 例如,假设一个人只能将状态提升到较高的状态,但不能将其移回较低的状态。您可以添加一个方法,该方法将采用当前状态并仅返回具有更高值的状态。

方法(添加到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 方法中更新它。

【讨论】:

  • 没有EnumDropDownListFor 过载需要SelectList
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多