2010-06-13 3 views
13

Désolé si cela est un dup, ma recherche n'a rien trouvé.Élément sélectionné dans les listes déroulantes à partir de Enum dans ASP.net MVC

J'utilise la méthode suivante pour générer des listes déroulantes pour les types de ENUM (Tiré de ici: http://addinit.com/?q=node/54):

public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected) 
{ 
    if (!type.IsEnum) 
     throw new ArgumentException("Type is not an enum."); 

    if(selected != null && selected.GetType() != type) 
     throw new ArgumentException("Selected object is not " + type.ToString()); 

    var enums = new List<SelectListItem>(); 
    foreach (int value in Enum.GetValues(type)) 
    { 
     var item = new SelectListItem(); 
     item.Value = value.ToString(); 
     item.Text = Enum.GetName(type, value); 

     if(selected != null) 
      item.Selected = (int)selected == value; 

     enums.Add(item); 
    } 

    return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, enums, "--Select--"); 
} 

Il fonctionne bien, sauf pour une chose. Si je donne à la liste déroulante le même nom que la propriété sur mon modèle, la valeur sélectionnée n'est pas définie correctement. Signification cela fonctionne:

<%= Html.DropDownList("fam", typeof(EnumFamily), Model.Family)%> 

Mais cela ne:

<%= Html.DropDownList("family", typeof(EnumFamily), Model.Family)%> 

Parce que je suis en train de transmettre un objet entier directement à la méthode du contrôleur je signale, je voudrais vraiment comme pour que la liste déroulante soit nommée pour la propriété sur le modèle. Lorsque vous utilisez le "bon" nom, la liste déroulante affiche correctement, je n'arrive tout simplement pas à définir la valeur sélectionnée.

Je ne pense pas que cette question est importante mais je suis en cours d'exécution sur MVC 1 mono 2.6

modifier: Je viens de tester cela sur les fenêtres, et je vois le même comportement

+0

J'ai vu le même comportement et j'ai travaillé en utilisant une liste déroulante différente. – Nate

Répondre

14

Essayez de ne pas utiliser la valeur int pour le ENUM/au lieu de:

item.Value = value.ToString();

utilisation:

item.Value = Enum.GetName(type, value);

imo ce qui se passe est Il définit automatiquement la valeur sélectionnée de la liste déroulante pour qu'elle corresponde au modèle, en utilisant le nom enum au lieu de sa valeur int. Rappelez-vous que le moteur de recherche recherche la valeur déjà sélectionnée non seulement dans le formulaire affiché (dans les cas où il est déjà posté), mais aussi dans le modèle + viewdata transmis à la vue. Seulement s'il ne le trouve pas, il utilisera la valeur sélectionnée que vous avez spécifiée.

+0

Cela semble être juste le billet Freddy - merci beaucoup. J'aurais aimé augmenter la prime. Je pensais vraiment que cela aurait un effet sur la valeur enum, mais c'est bon de savoir enfin ce qui se passe. Maintenant, je dois revenir en arrière et défaire tous les hacks que j'ai mis en place, donc je suppose que je devrais être en colère contre vous;) – AlexCuse

0

Cela ne semble assez juste, mais j'ai trouvé que si je nomme la liste déroulante avec {nameOfInputParameter}. {propertyName} il charge ET publie correctement. Donc, si la forme en question postait à une méthode prenant un paramètre du même type que le modèle de formulaire appelé « myModel » pourrait être mis en place comme le menu déroulant pour la famille ceci:

<%= Html.DropDownList("myModel.family", typeof(EnumFamily), Model.Family)%> 

Cela rend avec un id de myModel_family et un nom de myModel.family. Je ne suis pas sûr de ce que je ressens à ce sujet, cela me semble un peu exagéré. Mais cela semble fonctionner jusqu'à présent. Cela introduit cependant un nouveau problème. Vous ne pouvez plus initialiser, etc ... textboxes comme ceci:

<%= Html.TextBox("name") %> 

Cela va charger les valeurs correctement, mais lorsque vous publiez la méthode du contrôleur prenant « myModel » en tant que paramètre les valeurs ne sont pas reconnues comme partie de l'objet soumis. Nous devons donc inclure le nom du paramètre dans notre nom d'entrée.

Cependant, ce qui suit ne résout pas à une valeur, au moins en utilisant le modèle de liaison par défaut (je me demande si fouiller là-dedans va tenir la meilleure réponse à cette question):

<%= Html.TextBox("myModel.name") %> 

donc vous devez faire ceci:

<%= Html.TextBox("myModel.name", Model.Name) %> 

cela est d'autant obtenir assez brut (en particulier sur les pages où je dois être en mesure de faire face à des situations où le modèle est nulle).Espérons que quelqu'un d'autre a une meilleure idée :)

4

En fait, c'est la solution. La même solution que la mienne dans cette question.
ASP.NET MVC - Html.DropDownList - Value not set via ViewData.Model

public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected) 
    { 
     if (!type.IsEnum) 
      throw new ArgumentException("Type is not an enum."); 

     if (selected != null && selected.GetType() != type) 
      throw new ArgumentException("Selected object is not " + type.ToString()); 

     var enums = new List<SelectListItem>(); 
     foreach (int value in Enum.GetValues(type)) 
     { 
      var item = new SelectListItem(); 
      item.Value = value.ToString(); 
      item.Text = Enum.GetName(type, value); 

      if (selected != null) 
       item.Selected = (int)selected == value; 

      enums.Add(item); 
     } 

     // set ViewData first 
     helper.ViewData[name] = enums; 

     // pass in "null" intentionally into the DropDownList extension method 
     return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, null, "--Select--"); 
    } 

En utilisant item.Value = Enum.GetName(type, value); fait le menu déroulant < l'option > valeurs à rendre les noms Enum. Personnellement, je préfère avoir int valeurs comme publication.

Espérons que ça aide.

+0

Intéressant - Je n'ai pas pensé à utiliser ViewData comme ça. Je ne suis pas sûr de vouloir suivre cette voie, mais j'apprécie vraiment la réponse. Je ferai en sorte de l'essayer si je rencontre des problèmes avec l'approche actuelle. – AlexCuse

+0

C'était une réponse géniale, merci! – loraderon

+0

C'est génial Je cherchais une solution partout – bman

Questions connexes