2009-07-10 8 views
55

Imaginez que j'ai une énumération comme celle-ci (comme un exemple):Comment obtenir les valeurs d'un ENUM dans un SelectList

public enum Direction{ 
    Horizontal = 0, 
    Vertical = 1, 
    Diagonal = 2 
} 

Comment puis-je écrire une routine pour obtenir ces valeurs dans un système. Web.Mvc.SelectList, étant donné que le contenu de l'énumération est susceptible de changer dans le futur? Je veux obtenir le nom de chaque énumérations que le texte de l'option, et sa valeur en tant que texte de valeur, comme celui-ci:

<select> 
    <option value="0">Horizontal</option> 
    <option value="1">Vertical</option> 
    <option value="2">Diagonal</option> 
</select> 

C'est le meilleur que je peux trouver à ce jour:

public static SelectList GetDirectionSelectList() 
{ 
    Array values = Enum.GetValues(typeof(Direction)); 
    List<ListItem> items = new List<ListItem>(values.Length); 

    foreach (var i in values) 
    { 
     items.Add(new ListItem 
     { 
      Text = Enum.GetName(typeof(Direction), i), 
      Value = i.ToString() 
     }); 
    } 

    return new SelectList(items); 
} 

Cependant cela affiche toujours le texte d'option en tant que 'System.Web.Mvc.ListItem'. Déboguer à travers cela me montre aussi que Enum.GetValues ​​() retourne "Horizontal, Vertical" etc au lieu de 0, 1 comme je l'aurais attendu, ce qui me fait me demander quelle est la différence entre Enum.GetName() et Enum. GetValue().

+1

Ceci est une grande copie de http://stackoverflow.com/questions/1102022/display-enum-in-combobox-with-spaces et beaucoup, beaucoup d'autres. –

+0

[Les tenants et les aboutissants de C# enums] (http://www.codeducky.org/ins-outs-c-enums/) décrit la conversion entre les chaînes, les nombres et les énumérations ainsi que la façon d'énumérer les valeurs d'une énumération. – ChaseMedallion

Répondre

22

Pour obtenir la valeur d'un ENUM vous devez jeter le ENUM à son type sous-jacent:

Value = ((int)i).ToString(); 
+0

Merci! J'ai pensé à cela mais je pensais qu'il pourrait y avoir un moyen de le faire sans lancer. –

73

Cela fait longtemps que je l'ai eu à faire, mais je pense que cela devrait fonctionner.

var directions = from Direction d in Enum.GetValues(typeof(Direction)) 
      select new { ID = (int)d, Name = d.ToString() }; 
return new SelectList(directions , "ID", "Name", someSelectedValue); 
+5

Presque fonctionne, seulement besoin d'un changement mineur! Votre code définira la valeur au texte lorsque l'OP voulait que ce soit un entier. Correctif facile cependant. Changez 'ID = d' en' ID = (int) d'. Merci de l'avoir posté, je n'y aurais jamais pensé! – Chris

+0

Grande réponse, bien que j'ai trouvé que pour pré-remplir la liste déroulante, la valeur devait être la représentation textuelle de l'énumération, pas l'entier. –

3

peut-être pas une réponse exacte à la question, mais dans les scénarios CRUD i implémente habituellement quelque chose comme ceci:

private void PopulateViewdata4Selectlists(ImportJob job) 
{ 
    ViewData["Fetcher"] = from ImportFetcher d in Enum.GetValues(typeof(ImportFetcher)) 
           select new SelectListItem 
           { 
            Value = ((int)d).ToString(), 
            Text = d.ToString(), 
            Selected = job.Fetcher == d 
           }; 
} 

PopulateViewdata4Selectlists est appelée avant View ("Créer") et d'affichage ("Modifier"), puis et dans la vue:

<%= Html.DropDownList("Fetcher") %> 

et c'est tout ..

29

C'est ce que je viens de faire et personnellement, je pense que sexy:

public static IEnumerable<SelectListItem> GetEnumSelectList<T>() 
     { 
      return (Enum.GetValues(typeof(T)).Cast<T>().Select(
       enu => new SelectListItem() { Text = enu.ToString(), Value = enu.ToString() })).ToList(); 
     } 

Je vais faire des trucs de traduction finalement si la valeur = enu.ToString() fera un appel vers quelque chose quelque part.

+1

J'ai un problème avec ce code. La "valeur" de la SelectList est la même que le "texte". Lorsque vous utilisez Enums avec EntityFramework, la valeur enregistrée dans la base de données doit être un int. – meffect

+0

Ok, bien faites-le alors: Valeur = (int) enu – Dann

+2

(int) enu ne fonctionne pas –

4

Ou:

foreach (string item in Enum.GetNames(typeof(MyEnum))) 
{ 
    myDropDownList.Items.Add(new ListItem(item, ((int)((MyEnum)Enum.Parse(typeof(MyEnum), item))).ToString())); 
} 
16

que je voulais faire quelque chose de très similaire à la solution de Dann, mais il me fallait la valeur à un int et le texte à la représentation de chaîne de la Enum. C'est ce que je suis venu avec:

public static IEnumerable<SelectListItem> GetEnumSelectList<T>() 
    { 
     return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = Enum.GetName(typeof(T), e), Value = e.ToString() })).ToList(); 
    } 
+0

C'est de loin la meilleure réponse. Valeur nécessaire pour être une représentation int d'enum. –

3
public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct 
    { 
     if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj"); 

     var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; 
     //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() }; 

     return new SelectList(values, "ID", "Name", enumObj); 
    } 
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj, string selectedValue) where TEnum : struct 
    { 
     if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj"); 

     var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; 
     //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() }; 
     if (string.IsNullOrWhiteSpace(selectedValue)) 
     { 
      return new SelectList(values, "ID", "Name", enumObj); 
     } 
     else 
     { 
      return new SelectList(values, "ID", "Name", selectedValue); 
     } 
    } 
4
return 
      Enum 
      .GetNames(typeof(ReceptionNumberType)) 
      .Where(i => (ReceptionNumberType)(Enum.Parse(typeof(ReceptionNumberType), i.ToString())) < ReceptionNumberType.MCI) 
      .Select(i => new 
      { 
       description = i, 
       value = (Enum.Parse(typeof(ReceptionNumberType), i.ToString())) 
      }); 
0

J'ai plusieurs classes et méthodes pour diverses raisons:

ENUM collection d'articles

public static class EnumHelper 
{ 
    public static List<ItemDto> EnumToCollection<T>() 
    { 
     return (Enum.GetValues(typeof(T)).Cast<int>().Select(
      e => new ItemViewModel 
        { 
         IntKey = e, 
         Value = Enum.GetName(typeof(T), e) 
        })).ToList(); 
    } 
} 

Création SelectList dans le contrôleur

int selectedValue = 1; // resolved from anywhere 
ViewBag.Currency = new SelectList(EnumHelper.EnumToCollection<Currency>(), "Key", "Value", selectedValue); 

MyView.cshtml

@Html.DropDownListFor(x => x.Currency, null, htmlAttributes: new { @class = "form-control" }) 
3

Dans ASP.NET MVC base cela se fait avec tag helpers.

<select asp-items="Html.GetEnumSelectList<Direction>()"></select> 
+0

Quel bon moyen dans .NET Core –

0

J'ai eu beaucoup Selectlists enum et, après beaucoup de chasse et tamiser, a trouvé que faire une aide générique qui fonctionne le mieux pour moi. Il renvoie l'index ou le descripteur comme la valeur SelectList, et la description que le texte SelectList:

Enum:

public enum Your_Enum 
{ 
    [Description("Description 1")] 
    item_one, 
    [Description("Description 2")] 
    item_two 
} 

Aide:

public static class Selectlists 
{ 
    public static SelectList EnumSelectlist<TEnum>(bool indexed = false) where TEnum : struct 
    { 
     return new SelectList(Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(item => new SelectListItem 
     { 
      Text = GetEnumDescription(item as Enum), 
      Value = indexed ? Convert.ToInt32(item).ToString() : item.ToString() 
     }).ToList(), "Value", "Text"); 
    } 

    // NOTE: returns Descriptor if there is no Description 
    private static string GetEnumDescription(Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 
     DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
     if (attributes != null && attributes.Length > 0) 
      return attributes[0].Description; 
     else 
      return value.ToString(); 
    } 
} 

Utilisation: Définissez le paramètre sur 'true' pour les indices en tant que valeur:

var descriptorsAsValue = Selectlists.EnumSelectlist<Your_Enum>(); 
var indicesAsValue = Selectlists.EnumSelectlist<Your_Enum>(true); 
Questions connexes