Je crée une selectList dans mon contrôleur, à afficher dans la vue.
J'essaye de le créer à la volée, en quelque sorte ... 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>
Remarquez qu'aucun élément n'est sélectionné?
Comment puis-je réparer cela??
c#
asp.net-mvc
selectlist
Pure.Krome
la source
la source
Réponses:
C'est comme ça que je fais
Au deuxième coup d'œil, je ne suis pas sûr de savoir ce que vous recherchez ...
la source
SelectList sList = new SelectList(selectList, "Text", "Value", selected);
oùselected
est le client actuellement sélectionnéJ'utilise une méthode d'extension:
usage
avec
la source
En utilisant le constructeur qui accepte
items, dataValueField, dataTextField, selectedValue
comme paramètres:Ensuite, à votre avis:
la source
En m'appuyant sur la réponse de Thomas Stock, j'ai créé ces
ToSelectList
méthodes surchargées :Dans votre contrôleur, vous pouvez effectuer les opérations suivantes:
Et enfin dans votre vue, mettez:
Il en résultera la sortie souhaitée - bien sûr, vous pouvez
"(Select one)"
omettre l' optionLabel ci-dessus si vous ne voulez pas le premier élément vide:Mise à jour: Une liste de codes révisée peut être trouvée ici avec des commentaires XML.
la source
Le problème est que SelectList fonctionne comme prévu. Le bogue est dans la conception. Vous pouvez définir la propriété sélectionnée dans SelectedItem, mais cela sera complètement ignoré si vous parcourez la liste avec le GetEnumerator () (ou si Mvc le fait pour vous). Mvc créera à la place de nouveaux SelectListItems.
Vous devez utiliser le ctor SelectList avec le SelectListItem [], le Text-Name, le Value-Name et le SelectedValue. Soyez conscient de passer en tant que SelectedValue la valeur de SelectListItem, que vous souhaitez sélectionner, pas le SelectListItem lui-même! Exemple:
(pas testé cela, mais j'ai eu le même problème)
puis la 2ème option obtiendra l'attribut selected = "selected". Cela ressemble à de bons vieux DataSets ;-)
la source
Ceci est une option:
la source
Si c'est littéralement tout ce que vous voulez faire, déclarer simplement le tableau en tant que chaîne résout le problème de l'élément sélectionné:
la source
Il est très simple de faire en sorte que SelectList et SelectedValue fonctionnent ensemble, 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 Region est quelque chose comme ceci:
Et votre modèle de vue est quelque chose comme:
Vous pouvez avoir le code ci-dessous:
Uniquement si vous remplacez la méthode ToString de l'objet Region par quelque chose comme:
Cela a 100% de garantie de fonctionner.
Mais je crois vraiment que le meilleur moyen de faire fonctionner SelectList à 100% dans toutes les situations est d'utiliser la méthode Equals pour tester la valeur de propriété DropDownList ou ListBox contre chaque élément de la collection d'éléments.
la source
Il semble que si vous avez une vue fortement typée, vous devez changer l'ID de la liste déroulante afin qu'il ne soit PAS le nom d'une propriété sur la classe héritée. Vous devez ensuite mettre une logique dans votre méthode d'édition (POST) pour extraire la valeur sélectionnée de FORMCollection et la mettre sur votre instance avant de valider vos modifications.
C'est certainement un peu étrange, mais je l'ai essayé et ça marche.
Donc, si votre classe a un champ appelé CountryId, et que vous affichez une liste de noms de pays, faites en sorte que la liste déroulante ait un identifiant de CountryName plutôt que CountryId, puis dans le message, vous pouvez faire quelque chose avec Collection ["CountryName"] .
la source
J'ai eu exactement le même problème. La solution est simple. Changez simplement le paramètre "name" passé à l'assistant DropDownList en quelque chose qui ne correspond à aucune des propriétés existantes dans votre ViewModel. en savoir plus 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:
à votre santé!
la source
Toutes ces réponses ont l'air bien, mais il semble que le contrôleur prépare les données pour une vue dans un format structuré bien connu plutôt que de laisser la vue itérer simplement un IEnumerable <> fourni via le modèle et créer une liste de sélection standard, puis laisser DefaultModelBinder vous livrer l'élément sélectionné via un paramètre d'action. Oui, non, pourquoi pas? Séparation des préoccupations, oui? Cela semble étrange d'avoir le contrôleur pour créer quelque chose d'aussi spécifique à l'interface utilisateur et à la vue.
la source
Facile:
la source
Je l'ai juste couru comme ça et je n'ai eu aucun problème,
et
cela a également fonctionné si vous faites cela,
et
la source
En utilisant votre exemple, cela a fonctionné pour moi:
manette:
vue:
la source
la source
Je fais ça comme ça:
Le ToArray () s'occupe des problèmes.
la source
Si vous souhaitez transmettre du texte aléatoire à votre DropDownList, par exemple --Select-- vous pouvez facilement le faire en utilisant ce code:
la source
Il se peut que vous ayez une certaine ambiguïté dans votre ViewData:
Jetez un oeil ici
la source
la valeur sélectionnée dans le modèle profite au lieu de l'élément par défaut. (Je suis d'accord, je n'ai pas lu tous les messages)
la source
Je ne me souviens pas comment mvc 1 a été configuré, mais il semble qu'il voulait que la liste de sélection soit nommée de la même manière que le champ auquel elle appartenait ...
Ce que j'ai trouvé, comme quelqu'un l'a dit ci-dessus, c'est que mes listes de sélection ne fonctionnaient pas dans mvc2 lorsque les ViewData qu'elles avaient été envoyées étaient nommées comme le champ.
Par exemple:
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>
fonctionne quand
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>
ne fonctionne pas car le nom ViewData "ForID" est nommé de la même manière que le champ pour lequel il travaille
la source
Une explication possible est que la valeur de la liste de sélection à laquelle vous liez n'est pas une chaîne.
Dans cet exemple, le paramètre «PageOptionsDropDown» est-il une chaîne dans votre modèle? Parce que si ce n'est pas le cas, la valeur sélectionnée dans la liste ne sera pas affichée.
la source
Si vous recherchez dans le code source de MVC 2 la méthode d'extension Html.DropDownList, il ne vérifie jamais la propriété SelectedValue de la classe SelectList. Il n'essaiera jamais de correspondre à votre modèle.
Tout ce qui précède sont toutes des variations sur un thème, c'est-à-dire comment envoyer un tas de données à la vue pour une liste déroulante et ils sont tous aussi bons les uns que les autres (plus ou moins).
Le problème est dans la vue. Créez votre propre méthode d'extension DropDownList qui respecte la valeur de sélection que vous avez définie ou effectuez une itération à la main. Ce qui fonctionne le mieux pour vous.
la source
Si vous avez une collection dans votre modèle et que votre vue est fortement typée, une variation de ceci fonctionnera:
-ou-
la source