Das Problem, das Sie haben, verwendet Model.Items als Parameter. Der Code
<%= Html.DropDownList("items", new MultiSelectList(Model.AvailableItems,
"id", "name", Model.items), new { multiple = "multiple" })%>
funktioniert nicht wie erwartet. Es funktioniert, weil der Name des Dropdown-Menüs "Elemente" ist. Das liegt daran, dass ein Formularparameter mit der Bezeichnung "Elemente" zu Ihrer Aktion zurückgeschickt wurde. Dieser Parameter wird im ViewState der Aktion gespeichert (nicht mit ViewData verwechseln). Die Html.DropdownList() erkennt, dass es einen ViewState-Parameter gibt, der denselben Namen wie Ihr Dropdown-Name hat und diesen ViewState-Parameter verwendet, um die ausgewählten Werte zu berechnen. Es ignoriert vollständig die Model.items, die Sie übergeben haben.
Wenn jemand die Logik erklären kann, das Standardverhalten nicht zu überschreiben, dann würde ich es gerne hören.
Also, das ist dein erstes Problem. Um alles zu umgehen, müssen Sie das Dropdown-Menü in etwas anderes umbenennen - genau wie in Ihrem zweiten Beispiel. Jetzt kommt Ihr zweites Problem ins Spiel: Die Liste ausgewählter Objekte muss eine Sammlung einfacher Objekte sein (ich denke, es muss tatsächlich ein IEnumerable sein, aber ich bin mir nicht 100% sicher).
Die DropDownList() -Methode versucht, diese ausgewählten Werte mit dem Wert in Ihrer AvailableItems
-Auflistung abzugleichen. Wenn dies nicht möglich ist, wird versucht, den Text abzugleichen.
dies Also, versuchen Sie, um zu sehen, ob es
<%= Html.DropDownList("somethingelse", new MultiSelectList(Model.AvailableItems,
"id", "name", Model.items.Select(c=> c.name)), new { multiple = "multiple" })%>
Viel Glück
Statt mehrere auf Html der Einstellung .DropDownList können Sie Html.ListBoxFor verwenden. Da Html.DropDownList nur eines der auszuwählenden Elemente festlegen wird. –
@NikitaIgnatov Danke. Dein Kommentar hilft mir wirklich sehr. – gfan