这个枚举
public enum UserStatus
{
Employee = 0,
Evaluation,
Dismissed,
Registered,
}
并在视图中
@Html.EnumDropDownListFor(model => model.User.Metadata.Status)
因此它显示了Employee作为默认选项以及所有其他具有枚举队列(E,E,D,R)的项目。但是我想在这个队列中显示项目(评估,注册,员工,被解雇)(主要是评估必须是第一个)。
我无法更改枚举,并且我无法在GET控制器中设置为默认值(由于模型实现)。
任何想法如何解决这个问题?
答案 0 :(得分:0)
我不认为您可以在运行时更改列表的显示方式。我能想到的最简单的方法是处理这样的问题(你不能改变枚举值出现的顺序)是在每个定义序列号的枚举值上添加属性,然后将特定枚举中的所有项提取到创建一个可以绑定到视图的列表。这可能是一项额外的工作,但可以解决您的问题。
以下是示例代码:
public class Sequence : Attribute
{
public int SequenceNum { get; set; }
}
public enum UserStatus
{
[Sequence(SequenceNum=3)]
Employee = 0,
[Sequence(SequenceNum = 2)]
Evaluation,
[Sequence(SequenceNum = 4)]
Dismissed,
[Sequence(SequenceNum = 1)]
Registered,
}
在模型类中:
public IEnumerable<SelectListItem> ListData { get; set; }
public UserStatus Status { get; set; }
在控制器:
中List<KeyValuePair<int,string>> KeyValueList = new List<KeyValuePair<int,string>>();
// Get all the enum values
var values = Enum.GetValues(typeof(UserStatus)).Cast<UserStatus>();
// Iterate through each enum value to create a keyvalue list
foreach (var item in values)
{
var type = typeof(UserStatus);
var memInfo = type.GetMember(item.ToString());
var attributes = memInfo[0].GetCustomAttributes(typeof(Sequence),false);
KeyValueList.Add(new KeyValuePair<int,string>(((Sequence)attributes[0]).SequenceNum,item.ToString()));
}
// Sort the keyvalue list based on the *SequenceNum* attribute
KeyValueList.Sort((firstPair, nextPair) =>
{
return nextPair.Value.CompareTo(firstPair.Value);
});
// Add SelectListItem collection to a model property - Apparently you can add the generate collection to a ViewData ( if you don't wish to create another property )
model.ListData = KeyValueList.Select(x => new SelectListItem { Value = x.Key.ToString(), Text = x.Value }).ToList();
在查看:
中@Html.DropDownListFor(m => m.Status, Model.ListData));
发布数据时,将使用所选的枚举值填充模型属性Status。
希望它有所帮助。