2013-08-22 6 views
5

Ich habe eine Enum genannt CityTypeBind Enum mit Drop-Down-und legen ausgewählten Wert auf get Aktion in MVC C#

public enum CityType 
    { 
     [Description("Select City")] 
     Select = 0, 

     [Description("A")] 
     NewDelhi = 1, 

     [Description("B")] 
     Mumbai = 2, 

     [Description("C")] 
     Bangalore = 3, 

     [Description("D")] 
     Buxar = 4, 

     [Description("E")] 
     Jabalpur = 5 
    } 

generieren Liste von Enum

IList<SelectListItem> list = Enum.GetValues(typeof(CityType)).Cast<CityType>().Select(x => new SelectListItem(){ 
    Text = EnumHelper.GetDescription(x), 
    Value = ((int)x).ToString() 
}).ToList(); 

int city=0; 
if (userModel.HomeCity != null) city= (int)userModel.HomeCity; 
ViewData["HomeCity"] = new SelectList(list, "Value", "Text", city); 

Binden beim .cshtml

@Html.DropDownList("HomeCity",null,new { @style = "width:155px;", @class = "form-control" }) 

EnumHelper GetDescription-Klasse Beschreibung von Enum erhalten

+0

Also, was ist dein Problem? Und Ihre'Enum' sollte nicht den Wert 'Select = 0' enthalten. Sie erstellen die Option 'null' mit einer Überladung von 'DropDownList()', die eine 'labelOption' akzeptiert. Und um dies richtig zu machen, beziehen Sie sich auf die Antworten [hier] (http://stackoverflow.com/questions/388483/how-do-you-create-a-dropdownlist-from-an-enum-in-asp-net-mvc) –

+0

Related: https://stackoverflow.com/questions/17280906/binding-an-enum-to-a-dropdownlist-in-mvc-4/17281798 – Graham

Antwort

0

Dies ist der Code, den ich für enums in Dropdowns verwende. Dann verwenden Sie einfach @ Html.DropDown/For(); und setzen Sie diese SelectList in als param.

public static MvcHtmlString EnumDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Type enumType, object htmlAttributes = null) 
    { 
     ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 

     SelectList selectList = enumType.ToSelectList(metadata.Model.ToString()); 

     return htmlHelper.DropDownListFor(expression, selectList, htmlAttributes); 
    } 

Verwendung sieht dann folgendermaßen aus:

public static SelectList ToSelectList(this Type enumType, string selectedValue) 
    { 
     var items = new List<SelectListItem>(); 
     var selectedValueId = 0; 
     foreach (var item in Enum.GetValues(enumType)) 
     { 
      FieldInfo fi = enumType.GetField(item.ToString()); 
      DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
      var title = ""; 
      if (attributes != null && attributes.Length > 0) 
      { 
       title = attributes[0].Description; 
      } 
      else 
      { 
       title = item.ToString(); 
      } 

      var listItem = new SelectListItem 
      { 
       Value = ((int)item).ToString(), 
       Text = title, 
       Selected = selectedValue == ((int)item).ToString(), 
      }; 
      items.Add(listItem); 
     } 

     return new SelectList(items, "Value", "Text", selectedValueId); 
    } 

Sie können auch DropDownFor wie diese erweitern

@Html.EnumDropdownListFor(model => model.Property, typeof(SpecificEnum)) 
+0

Was ist die EnumExtension.ToSelectList? Das eine benutzerdefinierte Klasse? – Seth

+0

Es ist nur eine Klasse, in der diese ToSelectList() -Methode lebt. Altho wäre es sauberer, den enumType-Parameter als 'this' zu verwenden, also würdest du ihn dann wie folgt verwenden:' enumType.ToSelectList (metadata.Model.ToString()) ' Ich kann die Antwort ändern, um diese Verwendung anzuzeigen, wenn du wollen. – TheCodeDestroyer

+0

Ja können Sie bitte aktualisieren, weil ich nicht scheinen kann, es zu bekommen. Muss ich eine ToSelectList erstellen, weil sie nicht verfügbar ist? Vielen Dank! – Seth

1

ich über eben diesem Thema gebloggt, wodurch ich eine EnumHelper schaffen zu helfen mit dieser gemeinsamen Aufgabe.

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

In Ihrem Controller:

//If you don't have an enum value use the type 
ViewBag.DropDownList = EnumHelper.SelectListFor<MyEnum>(); 

//If you do have an enum value use the value (the value will be marked as selected)  
ViewBag.DropDownList = EnumHelper.SelectListFor(MyEnum.MyEnumValue); 

Ihrer Ansicht:

@Html.DropDownList("DropDownList") 
@* OR *@ 
@Html.DropDownListFor(m => m.Property, ViewBag.DropDownList as SelectList, null) 

Die Hilfsklasse:

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

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

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

     return value.ToString(); 
    } 

    /// <summary> 
    /// Build a select list for an enum 
    /// </summary> 
    public static SelectList SelectListFor<T>() where T : struct 
    { 
     Type t = typeof(T); 
     return !t.IsEnum ? null 
         : new SelectList(BuildSelectListItems(t), "Value", "Text"); 
    } 

    /// <summary> 
    /// Build a select list for an enum with a particular value selected 
    /// </summary> 
    public static SelectList SelectListFor<T>(T selected) where T : struct 
    { 
     Type t = typeof(T); 
     return !t.IsEnum ? null 
         : new SelectList(BuildSelectListItems(t), "Text", "Value", selected.ToString()); 
    } 

    private static IEnumerable<SelectListItem> BuildSelectListItems(Type t) 
    { 
     return Enum.GetValues(t) 
        .Cast<Enum>() 
        .Select(e => new SelectListItem { Value = e.ToString(), Text = e.GetDescription() }); 
    } 
}