C# 根据ASP.NET MVC中的条件选择要枚举DropDownlistFor的特定枚举

C# 根据ASP.NET MVC中的条件选择要枚举DropDownlistFor的特定枚举,c#,asp.net-mvc,enums,enumdropdownlistfor,C#,Asp.net Mvc,Enums,Enumdropdownlistfor,我有问题,仍然不理解EnumDropDownListFor中的Enum的概念,无法绑定特定的现有Enum值 public class LeaveRequestModel { public int LeaveId { get; set; } public string LeaveCode { get; set; } public string Reason { get; set; } public LeaveStatus Status { get; set; }

我有问题,仍然不理解EnumDropDownListFor中的Enum的概念,无法绑定特定的现有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" })
@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" })

结果是这样的:

我的问题是如何在EnumDropDownList for中仅显示特定条件下的特定Enum值
ApprovedByPV
ApprovedByHr
?如果可能的话,我怎么做

模型:

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);
}
视图:

型号:

控制器:

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);
}
视图:


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

方法(添加到
LeaveRequestModel
class)


注意,我猜测了您的情况,但是您可以在
GetAvailableStatuses
方法中更新它

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

方法(添加到
LeaveRequestModel
class)


注意,我猜测了您的情况,但是您可以在
GetAvailableStatuses
方法中更新它

这可以工作,但不使用枚举的显示名称属性。使用一种方法更新,您可以设置
文本
值,也可以使用类型反射动态提取属性值。这可以工作,但不使用枚举的显示名称属性。使用一种方法更新,您可以设置
文本
值,或者可以使用类型反射动态提取属性的值。是否检查了这些答案?在浏览器上隐藏它们是有效的替代方案吗?也许这是一个更简单的方法。你检查过这些答案吗?在浏览器上隐藏它们是有效的替代方案吗?也许这是一种更简单的方法。No
enumdopdownlistfor
重载需要
SelectList
。No
enumdopdownlistfor
重载需要
SelectList
@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" })