c#中的Enum绑定下拉列表

时间:2013-07-15 13:40:20

标签: asp.net-mvc c#-4.0

我正在使用Enum类,我必须绑定asp.net MVC4中的下拉列表(使用Razor视图引擎)。我可以绑定下拉列表,并可以在视图中显示。但我无法在编辑模式下显示所选项目。请任何人帮助我。我关注代码

我的ViewModelclass

public class UserViewModel
    {
 public string AccountId { get; set; }
        [Required]
        [Display(Name="First Name")]
        public String FirstName { get; set; }
        [Display(Name="Middle Name")]
        public String MiddleName { get; set; }
        [Required]
        [Display(Name="Last Name")]
        public String LastName { get; set; }
        public String UserRoles { get; set; }
} 

和Enum类是,

 public enum UserType // Office User Types
    {
        Officer = 1,
        Administrator = 2,
        Recruiter = 3
    }

我正在控制器中使用以下代码

Dictionary<string, string> rolename = Enum.GetValues(typeof(UserType))
   .Cast<UserType>()
   .Select(v => v.ToString())
   .ToDictionary<string, string>(v => v.ToString());
            ViewBag.Roles = rolename;
   return View();

我的观点是,

 @Html.DropDownListFor(model => model.UserRoles,new SelectList(ViewBag.Roles, "Key", "Value",Model.UserRoles.ToString()), new { id = "UserRoles" })

请帮我看看我的错误以及如何在编辑模式下的下拉列表中显示所选值。

2 个答案:

答案 0 :(得分:1)

以下代码从SelectList

生成enum
    public static IEnumerable<SelectListItem> EnumToSelectList(System.Type type)
    {
        var output = new List<SelectListItem>();
        foreach (int item in Enum.GetValues(type))
        {
            var si = new System.Web.Mvc.SelectListItem();
            si.Value = item.ToString();

            DisplayAttribute attr =(DataAnnotations.DisplayAttribute)
                type.GetMember(Enum.GetName(type, item))
                .First().GetCustomAttributes(typeof(DataAnnotations.DisplayAttribute), false)
                .FirstOrDefault();
            si.Text = (attr == null) ? Enum.GetName(type, item) : attr.Name;
            output.Add(si);
        }
        return output;

    }

从代码中可以看出,如果DisplayAttribute名称中的名称不是“用户友好”,它还会使用数据注释enum来提供帮助。

这也可以作为HtmlHelper的扩展而抽象,但不是必须的。

    public static IEnumerable<SelectListItem> EnumToSelectList(
        this HtmlHelper helper, 
        System.Type type)
    {
        return EnumToSelectList(type);
    }

用法很简单:

@Html.DropDownListFor(model => model.UserRoles, 
    Html.EnumToSelectList(typeof(UserType))

答案 1 :(得分:0)

我创建了一个枚举帮助器,它将为您提供枚举所需的选择列表。如果您有一个值,它也会自动处理您选择的值。看一看。

http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23

如果您实施以下内容,则可能会解决您的问题:

//In the controller
ViewBag.DropDownList = EnumHelper.SelectListFor(myEnumValue);

//In the view
@Html.DropDownList("DropDownList") 

/// OR
@Html.DropDownListFor(m => m.DropDownList, ViewBag.DropDownList as IEnumerable<SelectListItem>)

以上利用了这个助手

public static class EnumHelper  
{  
    //Creates a SelectList for a nullable enum value  
    public static SelectList SelectListFor<T>(T? selected)  
        where T : struct  
    {  
        return selected == null ? SelectListFor<T>()  
                                : SelectListFor(selected.Value);  
    }  

    //Creates a SelectList for an enum type  
    public static SelectList SelectListFor<T>() where T : struct  
    {  
        Type t = typeof (T);  
        if (t.IsEnum)  
        {  
            var values = Enum.GetValues(typeof(T)).Cast<enum>()  
                             .Select(e => new { Id = Convert.ToInt32(e), Name = e.GetDescription() });  

            return new SelectList(values, "Id", "Name");  
        }  
        return null;  
    }  

    //Creates a SelectList for an enum value  
    public static SelectList SelectListFor<T>(T selected) where T : struct   
    {  
        Type t = typeof(T);  
        if (t.IsEnum)  
        {  
            var values = Enum.GetValues(t).Cast<Enum>()  
                             .Select(e => new { Id = Convert.ToInt32(e), Name = e.GetDescription() });  

            return new SelectList(values, "Id", "Name", Convert.ToInt32(selected));  
        }  
        return null;  
    }   

    // Get the value of the description attribute if the   
    // enum has one, otherwise use the value.  
    public static string GetDescription<TEnum>(this TEnum value)  
    {  
        FieldInfo fi = value.GetType().GetField(value.ToString());  

        if (fi != null)  
        {  
            DescriptionAttribute[] attributes =  
             (DescriptionAttribute[])fi.GetCustomAttributes(  
    typeof(DescriptionAttribute),  
    false);  

            if (attributes.Length > 0)  
            {  
                 return attributes[0].Description;  
            }  
        }  

        return value.ToString();  
    }  
}