2013-07-15 2 views
1

У меня есть класс Enum, и мне нужно связать выпадающий список в asp.net MVC4 (используя механизм просмотра Razor). Я могу связать выпадающий список и показать его в поле зрения. Но я не мог показать выбранный элемент в режиме редактирования. Пожалуйста, помогите мне. Я Хавин следующий кодСвязывание выпадающего списка из Enum в C#

мой 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" }) 

Пожалуйста, помогите мне в чем моя ошибка и как отобразить выбранное значение в выпадающем списке в режиме редактирования.

+1

Может быть, что 'UserRoles' в вашей модели «Сотрудник», «Администратор» и т. д., а ключ для раскрывающегося списка - 1, 2, 3 и т. д.? – Kane

ответ

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)) 
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(); 
    } 
} 
Смежные вопросы