Pourquoi est-ListBoxFor pas à sélectionner des éléments, mais ListBox est?
J'ai le code suivant dans mon point de vue:
<%= Html.ListBoxFor(c => c.Project.Categories,
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
<%= Html.ListBox("MultiSelectList",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
La seule différence est que la première aide est fortement typé (ListBoxFor), et il ne parvient pas à afficher les éléments sélectionnés (1,2), même si les éléments s'affichent dans la liste, etc. Le plus simple zone de liste fonctionne comme prévu.
Je suis évidemment manque quelque chose ici. Je peux utiliser la deuxième approche, mais cela m'énerve vraiment et j'aimerais comprendre.
Pour référence, mon modèle est:
public class ProjectEditModel
{
public Project Project { get; set; }
public IEnumerable<Project> Projects { get; set; }
public IEnumerable<Client> Clients { get; set; }
public IEnumerable<Category> Categories { get; set; }
public IEnumerable<Tag> Tags { get; set; }
public ProjectSlide SelectedSlide { get; set; }
}
Mise à jour
Je viens de changer la zone de liste nom de Projet.Catégories (correspondant à mon modèle) et à présent, il ne parvient pas à sélectionner l'élément.
<%= Html.ListBox("Project.Categories",
new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>
Je suis de toute évidence ne pas comprendre la magie qui se passe ici.
Mise à jour 2
Ok, c'est purement de nommage, par exemple, cela fonctionne...
<%= Html.ListBox("Project_Tags",
new MultiSelectList(Model.Tags, "Id", "Name", Model.Project.Tags.Select(t => t.Id)))%>
...parce que le nom du champ est Project_Tags, pas de Projet.Les balises, en fait, rien d'autre que des Balises ou d'un Projet.Les balises de travail. Je ne comprends pas pourquoi ce serait la cause d'un problème (autre que cela correspond au nom de l'entité), et je ne suis pas assez bon d'être en mesure de creuser et de trouver.
- J'ai eu un problème similaire. Spécifiquement si j'étais ma valeur sélectionnée de la zone de liste (sur le modèle) à partir du contrôleur de base sur une autre valeur. Pour obtenir que cela fonctionne, je dois mettre la ModelState["Catégories"].De la valeur. Je n'aime pas ça, mais l'idée que le ModelState objet peut être utilisé sur le Modèle lui-même est confuse au possible, exaspérant au pire.
Vous devez vous connecter pour publier un commentaire.
J'ai tombé sur ce problème moi-même, j'ai enfin compris que le problème était une convention de nommage.
Vous ne pouvez pas nommer le ViewBag ou ViewData matériels contenant le SelectList ou MultiSelectList le même nom que votre modèle de propriété contenant les éléments sélectionnés. Au moins pas si vous êtes à l'aide de la ListBoxFor ou DropDownListFor helper.
Voici un exemple:
Je suis sûr qu'il ya beaucoup d'autres façons de le faire, mais il a résolu mon problème, j'espère que ça aidera quelqu'un!
J'ai également été coincé avec exactement le même problème et a rencontré le même problème avec ListBox et ListBoxFor.
Peu importe ce que je fais, je ne peux pas obtenir des sélections à se produire sur la ListBoxFor. Si je change pour le contrôle ListBox et un nom AUTRE que le nom de la propriété des données, je suis de liaison, les sélections se produire.
Mais ensuite parce que je ne suis pas en utilisant ListBoxFor et les données sont assis à l'intérieur d'une classe de modèle (Model.Les ministères) par exemple, je n'ai pas le modèle de liaison sur le chemin du retour à mon contrôleur et donc la propriété est null.
MODIFIER j'ai trouvé une solution posté par quelqu'un d'autre ici;
Les défis de la sélection de valeurs dans ListBoxFor
La réponse correcte est qu'il ne fonctionne pas très bien. En tant que tel, j'ai lu le MVC code. Ce que vous devez faire est de mettre en œuvre IConvertible et aussi de créer un TypeConverter.
Donc, dans mon exemple j'ai eu un
Country
classe, telle que les gens pouvaient choisir parmi une liste de pays. Pas de joie en le sélectionnant. Je m'attendais à un objet est égale à la comparaison sur leselectedItems
contre lalistitems
mais non, ce n'est pas la façon dont il fonctionne. Malgré le fait queMultiListItem
fonctionne correctement et obtient les éléments sélectionnés, du moment où elle est liée à votre modèle est basée sur la vérification de la chaîne de represnetation de votre instance de l'objet correspond à la chaîne"value"
(ou son nom si c'est manquante) dans la liste des éléments dans leSelectItemList
.Donc, de mettre en œuvre
IConvertible
, le retour de la chaîne de valeur deToString
qui correspondent à la valeur de laSelectItemList
. e.g dans mon casCountryCode
a été sérialisé dans laSelectItem
Value
de la propriété , de sorte que dansToString IConvertible
je suis retournéCountryCode
. Maintenant, tout sélectionne correctement.Je ferai remarquer la
TypeConverter
est utilisé sur la manière. Cette fois, l'inverse. QueCountrycode
revient en et "EN" les besoins de la conversion enCountry
instance de classe. C'est là que leTypeConverter
est venu. C'est aussi le temps que j'ai réalisé la difficulté de cette approche est d'utiliser.p.s donc, sur votre
Category
classe vous avez besoin pour mettre en œuvreIConvertible
. Si son de l'entité cadre de mon entreprise, alors vous aurez besoin d'utiliser la classe partielle de mettre en œuvreIConvertible
et de mettre en œuvreToString
et décorer avec unTypeConverter
vous avez écrit trop.Aussi, vous pouvez essayer d'effacer ModelState pour c.Projet.Les catégories dans le contrôleur:
Et d'utiliser la prochaine construction:
Où c.Projet.Catégories
IEnumerable<int>
.Désolé pour mon anglais. Bonne chance!
Bien que ce n'est pas la réponse à votre question principale, il est intéressant de noter que lorsque MVC génère des noms il va se transformer en quelque chose comme Projet.Les Tags dans Project_Tags, en remplacement de périodes avec des traits de soulignement.
La raison qu'il ne c'est parce que d'une période à l'ID de l'élément ressemblerait à un élément nommé Projet avec une classe de Balises CSS. Clairement une mauvaise chose, d'où la traduction par des traits de soulignement pour garder un comportement prévisible.
Dans votre premier exemple,
la zone de liste est tentant de lier le Modèle.Projet.Catégories pour votre fortement typé Modèle qui a été fourni à la page (à l'aide de la lambda notation). Je ne suis pas sûr de ce que le deuxième paramètre dans la ListBoxFor est de faire cependant.
Quel est le Modèle qui est passé de la page?
Essayer cette
Html.ListboxFor et Html.Listbox sont parfaits lorsque vous n'êtes PAS de liaison de la zone de liste à sa source de données. Je suppose que l'utilisation prévue est: est-ce
Dans la vue:
Noter que dans ce cas, vous n'avez pas explicitement à-dire dont les valeurs sont sélectionnées dans le MultiSelectList - le modèle de la liaison à l'emporte, même si vous ne!