128 votes

Comment puis-je faire fonctionner cette SelectList ASP.NET MVC ?

Je crée une liste de sélection dans mon contrôleur, pour l'afficher dans la vue.

J'essaie de le créer à la volée, une sorte de chose ... comme ça ...

myViewData.PageOptionsDropDown = 
   new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");

Il compile, mais la sortie est mauvaise...

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
    <option>10</option>
    <option>15</option>
    <option>25</option>
    <option>50</option>
    <option>100</option>
    <option>1000</option>
</select>

Vous avez remarqué qu'aucun élément n'est sélectionné ?

Comment puis-je réparer cela ?

1 votes

Six réponses... une favorisée... pas de upvotes :/ Je lui donne un +1.

0 votes

11voto

murki Points 317

C'est une option :

myViewData.PageOptionsDropDown = new[] 
{
 new SelectListItem { Text = "10", Value = "10" },
 new SelectListItem { Text = "15", Value = "15", Selected = true }
 new SelectListItem { Text = "25", Value = "25" },
 new SelectListItem { Text = "50", Value = "50" },
 new SelectListItem { Text = "100", Value = "100" },
 new SelectListItem { Text = "1000", Value = "1000" },
}

10voto

macon Points 236

Si c'est littéralement tout ce que vous voulez faire, le fait de déclarer le tableau en tant que chaîne de caractères résout le problème des éléments sélectionnés :

myViewData.PageOptionsDropDown = 
   new SelectList(new string[] {"10", "15", "25", "50", "100", "1000"}, "15");

8voto

ararog Points 772

Il est très simple de faire fonctionner ensemble SelectList et SelectedValue, même si votre propriété n'est pas un objet simple comme une valeur Int, String ou Double.

Exemple :

En supposant que notre objet Région soit quelque chose comme ceci :

public class Region {
     public Guid ID { get; set; }
     public Guid Name { get; set; }
}

Et votre modèle de vue est quelque chose comme :

public class ContactViewModel {
     public DateTime Date { get; set; }
     public Region Region { get; set; }
     public List<Region> Regions { get; set; }
}

Vous pouvez avoir le code ci-dessous :

@Html.DropDownListFor(x => x.Region, new SelectList(Model.Regions, "ID", "Name")) 

Seulement si vous surchargez la méthode ToString de l'objet Region en quelque chose comme :

public class Region {
     public Guid ID { get; set; }
     public Guid Name { get; set; }

     public override string ToString()
     {
         return ID.ToString();
     }
}

Ce produit est garanti à 100%.

Mais je crois vraiment que la meilleure façon de faire fonctionner SelectList à 100% dans toutes les circonstances est d'utiliser la méthode Equals pour tester la valeur des propriétés de DropDownList ou ListBox par rapport à chaque élément de la collection items.

5voto

Il semble que si vous avez une vue fortement typée, vous devez modifier l'ID de la liste déroulante pour qu'elle ne soit PAS le nom d'une propriété de la classe héritée. Vous devez ensuite introduire une certaine logique dans votre méthode d'édition (POST) pour extraire la valeur sélectionnée de la collection FORMC et la placer dans votre instance avant de valider vos modifications.

C'est certainement un peu étrange, mais j'ai essayé et ça marche.

Ainsi, si votre classe possède un champ appelé CountryId, et que vous affichez une liste de noms de pays, faites en sorte que la liste déroulante ait un id de CountryName plutôt que de CountryId, alors dans le message, vous pouvez faire quelque chose avec Collection["CountryName"].

4voto

cleftheris Points 459

J'ai eu exactement le même problème. La solution est simple. Il suffit de changer le paramètre "name" passé à l'aide DropDownList par quelque chose qui ne correspond à aucune des propriétés existantes dans votre ViewModel. Pour en savoir plus, cliquez ici : http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view

Je cite le Dan Watson :

En MVC, si la vue est fortement typée, l'option sélectionnée de la liste de sélection sera remplacée et la propriété de l'option sélectionnée définie sur le constructeur n'atteindra jamais la vue et la première option de la liste déroulante sera sélectionnée à la place (pourquoi est toujours un peu un mystère).

Santé !

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