J'ai essayé ceci est RC1 puis mis à niveau vers RC2 qui n'a pas résolu le problème.
// in my controller
ViewData["UserId"] = new SelectList(
users,
"UserId",
"DisplayName",
selectedUserId.Value); // this has a value
résultat: la propriété SelectedValue est définie sur l'objet
// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%>
résultat: toutes les options attendues sont rendues au client, mais l'attribut sélectionné n'est pas défini. L'élément de SelectedValue existe dans la liste, mais le premier élément de la liste est toujours sélectionné par défaut.
Comment dois-je faire ça?
Mise à jour Grâce à la réponse de John Feminella, j'ai découvert quel était le problème. "UserId" est une propriété du modèle dans laquelle ma vue est fortement typée. Lorsque Html.DropDownList ("UserId" est modifié en tout autre nom mais "UserId", la valeur sélectionnée est rendue correctement.
Il en résulte que la valeur n'est pas liée au modèle.
asp.net-mvc
blu
la source
la source
Réponses:
Voici comment j'ai résolu ce problème:
J'ai eu ce qui suit:
Manette:
Vue
Modifié par ce qui suit:
Vue
Il semble que le DropDown ne doit pas avoir le même nom a le nom ViewData: S bizarre mais cela a fonctionné.
la source
Essaye ça:
Puis:
Avec MVC RC2, j'obtiens:
la source
Vous pouvez toujours nommer DropDown comme "UserId" et avoir toujours la liaison de modèle fonctionnant correctement pour vous.
La seule condition requise pour que cela fonctionne est que la clé ViewData qui contient la SelectList n'a pas le même nom que la propriété Model que vous souhaitez lier. Dans votre cas particulier, ce serait:
Cela produira un élément de sélection nommé UserId, qui porte le même nom que la propriété UserId dans votre modèle et par conséquent, le classeur de modèle le définira avec la valeur sélectionnée dans l'élément de sélection du html généré par l'assistant Html.DropDownList.
Je ne sais pas pourquoi ce constructeur Html.DropDownList particulier ne sélectionne pas la valeur spécifiée dans SelectList lorsque vous placez la liste de sélection dans ViewData avec une clé égale au nom de la propriété. Je soupçonne que cela a quelque chose à voir avec la façon dont l'assistant DropDownList est utilisé dans d'autres scénarios, où la convention est que vous avez une SelectList dans ViewData avec le même nom que la propriété de votre modèle. Cela fonctionnera correctement:
la source
Si nous ne pensons pas que ce soit un bogue que l'équipe devrait corriger, MSDN devrait au moins améliorer le document. La confusion vient vraiment du mauvais document à ce sujet. Dans MSDN , il explique le nom des paramètres comme suit :
Cela signifie simplement que le code HTML final qu'il génère utilisera ce paramètre comme nom de l'entrée sélectionnée. Mais cela signifie en fait plus que cela.
Je suppose que le concepteur suppose que l'utilisateur utilisera un modèle de vue pour afficher la liste déroulante, utilisera également la publication dans le même modèle de vue. Mais dans de nombreux cas, nous ne suivons pas vraiment cette hypothèse.
Utilisez l'exemple ci-dessus,
Si nous suivons l'hypothèse, nous devrions définir un modèle de vue pour cette vue associée à la liste déroulante
Parce que lors de la publication, seule la valeur sélectionnée sera publiée, elle suppose donc qu'elle doit être renvoyée à la propriété du modèle SelectedPersonId, ce qui signifie que le premier nom de paramètre de Html.DropDownList doit être «SelectedPersonId». Ainsi, le concepteur pense que lors de l'affichage de la vue du modèle dans la vue, la propriété du modèle SelectedPersonId doit contenir la valeur par défaut de cette liste déroulante. Même si votre liste <SelectListItem> Persons a déjà défini l'indicateur Selected pour indiquer lequel est sélectionné / par défaut, le tml.DropDownList l'ignorera et reconstruira son propre IEnumerable <SelectListItem> et définira l'élément par défaut / sélectionné en fonction du nom.
Voici le code de asp.net mvc
Ainsi, le code est allé plus loin, il essaie non seulement de rechercher le nom dans le modèle, mais également dans les données de vue, dès qu'il en trouve un, il reconstruit la selectList et ignore votre Sélection d'origine.
Le problème est que dans bien des cas, nous ne l'utilisons pas vraiment de cette façon. nous voulons simplement lancer une liste de sélection avec un / plusieurs élément (s) sélectionné (s) défini sur true.
Bien sûr, la solution est simple, utilisez un nom qui ne figure ni dans le modèle ni dans les données de vue. Lorsqu'il ne trouve pas de correspondance, il utilisera la liste de sélection d'origine et la sélection d'origine prendra effet.
Mais je pense toujours que mvc devrait l'améliorer en ajoutant une condition supplémentaire
Parce que, si la liste de sélection d'origine en a déjà eu une, pourquoi l'ignoreriez-vous?
Juste mes pensées.
la source
Le code dans le précédent article MVC 3 ne fonctionne pas mais c'est un bon début. Je le réparerai. J'ai testé ce code et il fonctionne dans MVC 3 Razor C # Ce code utilise le modèle ViewModel pour remplir une propriété qui renvoie un fichier
List<SelectListItem>
.La classe Model
La classe ViewModel
La méthode du contrôleur
La vue
La sortie HTML sera quelque chose comme
selon la façon dont vous formatez la sortie. J'espère que ça aide. Le code fonctionne.
la source
selected
option.Cela semble être un bogue dans la classe SelectExtensions car il ne vérifiera que les ViewData plutôt que le modèle pour l'élément sélectionné. L'astuce consiste donc à copier l'élément sélectionné du modèle dans la collection ViewData sous le nom de la propriété.
Ceci est tiré de la réponse que j'ai donnée sur les forums MVC, j'ai également une réponse plus complète dans un article de blog qui utilise l'attribut DropDownList de Kazi ...
Étant donné un modèle
et un modèle de vue de base de
Ensuite, nous écrivons un modèle d'éditeur DropDownList comme suit.
Cela fonctionnera également si vous changez ArticleType dans le modèle de vue en SelectListItem, bien que vous deviez implémenter un convertisseur de type selon le blog de Kazi et l'enregistrer pour forcer le classeur à le traiter comme un type simple.
Dans votre contrôleur, nous avons alors ...
la source
Le problème est que les dropbox ne fonctionnent pas de la même manière que les listbox, du moins comme l'attend la conception ASP.NET MVC2: une dropbox n'autorise que zéro ou une valeur, car les listbox peuvent avoir une sélection de valeurs multiples. Donc, étant stricte avec HTML, cette valeur ne devrait pas être dans la liste d'options comme indicateur "sélectionné", mais dans l'entrée elle-même.
Consultez l'exemple suivant:
Le combo a l'option sélectionnée, mais a également son attribut de valeur défini . Donc, si vous voulez qu'ASP.NET MVC2 rende une boîte de dépôt et ait également une valeur spécifique sélectionnée (c'est-à-dire des valeurs par défaut, etc.), vous devez lui donner une valeur dans le rendu, comme ceci:
la source
Dans ASP.NET MVC 3, vous pouvez simplement ajouter votre liste à ViewData ...
... puis référencez-le par son nom dans votre vue rasoir ...
Vous n'avez pas à "utiliser" manuellement la liste dans l'appel DropDownList. En procédant de cette façon, définissez correctement la valeur sélectionnée pour moi aussi.
Avertissement:
la source
J'ai réussi à obtenir le résultat souhaité, mais avec une approche légèrement différente. Dans la liste déroulante, j'ai utilisé le modèle, puis je l'ai référencé. Je ne sais pas si c'était ce que vous recherchiez.
Model.Matters.FeeStructures ci-dessus est mon identifiant, qui pourrait être votre valeur de l'élément qui devrait être sélectionné.
la source