Ich habe das folgende Ansichtsmodell
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
und die folgende Controller-Methode, um ein neues Projekt zu erstellen und a zuzuweisen Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
und in der Ansicht
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
Die Ansicht wird korrekt angezeigt, aber beim Senden des Formulars wird die folgende Fehlermeldung angezeigt
InvalidOperationException: Das ViewData-Element mit dem Schlüssel 'CategoryID' ist vom Typ 'System.Int32', muss jedoch vom Typ 'IEnumerable <SelectListItem>' sein.
Der gleiche Fehler tritt bei der @Html.DropDownList()
Methode auf, und wenn ich die SelectList mit einem ViewBag
oder übergebe ViewData
.
Laut der Antwort von stephens (user3559349) kann dies nützlich sein:
oder in ProjectVM:
quelle
Höchstwahrscheinlich hat es einen Fehler verursacht, der auf Ihre Seite umgeleitet wurde, und Sie haben die Dropdown-Listen Ihres Modells nicht erneut initialisiert.
Stellen Sie sicher, dass Sie Ihre Dropdowns entweder im Konstruktor des Modells oder jedes Mal initialisieren, bevor Sie das Modell an die Seite senden.
Andernfalls müssen Sie den Status der Dropdown-Listen entweder über die Ansichtstasche oder über die Hilfsprogramme für versteckte Werte beibehalten.
quelle
Ich hatte das gleiche Problem, ich bekam einen ungültigen ModelState, als ich versuchte, das Formular zu posten. Für mich wurde dies dadurch verursacht, dass CategoryId auf int gesetzt wurde. Als ich es in string änderte, war der ModelState gültig und die Create-Methode funktionierte wie erwartet.
quelle
OK, die eingemachte Antwort des Posters erklärte genau, warum der Fehler aufgetreten ist, aber nicht, wie man ihn zum Laufen bringt . Ich bin mir nicht sicher, ob das wirklich eine Antwort ist, aber es hat mich in die richtige Richtung gelenkt.
Ich bin auf dasselbe Problem gestoßen und habe einen cleveren Weg gefunden, es zu lösen. Ich werde versuchen, das hier festzuhalten. Haftungsausschluss - Ich arbeite ungefähr einmal im Jahr an Webseiten und weiß wirklich nicht, was ich die meiste Zeit mache. Diese Antwort sollte in keiner Weise als "Experten" -Antwort betrachtet werden, aber sie erledigt den Job mit wenig Arbeit ...
Da ich ein Datenobjekt habe (höchstwahrscheinlich ein Datenübertragungsobjekt), möchte ich eine Dropdown-Liste verwenden, um gültige Werte für ein Feld bereitzustellen, z. B.:
Dann sieht das ViewModel folgendermaßen aus:
Das eigentliche Problem hier ist, wie @Stephen oben so eloquent beschrieben hat, dass die Auswahlliste nicht mit der POST-Methode in der Steuerung gefüllt ist. Ihre Controller-Methoden würden also folgendermaßen aussehen:
Hier hast du es. Dies ist KEIN funktionierender Code. Ich habe ihn kopiert / eingefügt und bearbeitet, um es einfach zu machen, aber Sie haben die Idee. Wenn die Datenelemente sowohl im ursprünglichen Datenmodell als auch im abgeleiteten Ansichtsmodell denselben Namen haben, kann UpdateModel () aus den FormCollection-Werten genau die richtigen Daten für Sie eingeben.
Ich poste dies hier, damit ich die Antwort finden kann, wenn ich unweigerlich wieder auf dieses Problem stoße - hoffentlich hilft es auch jemand anderem.
quelle
In meinem Fall war die erste ID in meiner Liste Null. Nachdem ich die ID von 1 geändert hatte, funktionierte sie.
quelle