在@Html.EnumDropDownListFor中更改项目队列

时间:2014-09-08 16:44:01

标签: html asp.net-mvc enums

这个枚举

public enum UserStatus
{ 
    Employee = 0,
    Evaluation,
    Dismissed,
    Registered,
}

并在视图中

@Html.EnumDropDownListFor(model => model.User.Metadata.Status)

因此它显示了Employee作为默认选项以及所有其他具有枚举队列(E,E,D,R)的项目。但是我想在这个队列中显示项目(评估,注册,员工,被解雇)(主要是评估必须是第一个)。

我无法更改枚举,并且我无法在GET控制器中设置为默认值(由于模型实现)。

任何想法如何解决这个问题?

1 个答案:

答案 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。

希望它有所帮助。