77 votes

Comment obtenir les valeurs d'un enum dans une SelectList ?

Imaginons que j'ai une énumération comme celle-ci (juste à titre d'exemple) :

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

Comment puis-je écrire une routine pour obtenir ces valeurs dans un System.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ération comme texte de l'option, et sa valeur comme texte de la valeur, comme ceci :

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

C'est ce que j'ai trouvé de mieux jusqu'à présent :

 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, le texte de l'option est toujours rendu par 'System.Web.Mvc.ListItem'. En déboguant, je constate également que Enum.GetValues() renvoie 'Horizontal, Vertical' etc. au lieu de 0, 1 comme je m'y attendais, ce qui me fait me demander quelle est la différence entre Enum.GetName() et Enum.GetValue().

96voto

Brandon Points 35624

Ça fait longtemps que je n'ai pas eu à faire ça, mais je pense que ça devrait marcher.

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);

34voto

Dann Points 4231

C'est ce que je viens de faire et personnellement je trouve ça 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 éventuellement faire des traductions pour que la Value = enu.ToString() fasse un appel à quelque chose quelque part.

28voto

Andrew Hare Points 159332

Pour obtenir la valeur d'une énumération, vous devez la convertir en son type sous-jacent :

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

25voto

J.Noel.K Points 81

Je voulais faire quelque chose de très similaire à la solution de Dann, mais j'avais besoin que la valeur soit un int et que le texte soit la représentation en chaîne de l'Enum. Voici ce que j'ai trouvé :

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();
    }

4voto

Carl Hörberg Points 2786

Ce n'est peut-être pas une réponse exacte à la question, mais dans les scénarios CRUD, j'implémente généralement 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é avant View("Create") et View("Edit"), puis et dans le View :

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

et c'est tout..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X