Ich versuche, eine Dropdown-Liste aus einer mit Linq-2-SQL zugeordneten Datenbank mit ASP.NET MVC 2 zu füllen und erhalte weiterhin diesen Fehler.
Ich bin so verwirrt, weil ich IEnumerable<SelectListItem>
in der zweiten Zeile eine Variable vom Typ deklariere , aber der Fehler lässt mich denken, dass dies nicht der Fall ist. Ich denke, das sollte sehr einfach sein, aber ich kämpfe. Jede Hilfe wird geschätzt.
Hier sind die interessanten Teile meines Controllers:
public ActionResult Create()
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View();
}
Und hier sind die interessanten Teile meiner Ansicht:
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype") %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
Hier ist die POST-Aktion beim Absenden des Formulars
// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
if (ModelState.IsValid)
{
try
{
// TODO: Add insert logic here
var db = new DB();
db.Meals.InsertOnSubmit(meal);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch
{
return View(meal);
}
}
else
{
return View(meal);
}
}
Vielen Dank.
asp.net-mvc
JBibbs
quelle
quelle
Antworten:
Ich hatte das gleiche Problem und endlich bekam ich die Antwort ...
Das Problem besteht darin, dass in der POST-Aktion nach dem Senden des Formulars der ModelState ungültig ist oder ein Fehler in try / catch auftritt, sodass die Ansicht zurückgegeben wird. Diesmal ist die Ansicht jedoch nicht
ViewData["basetype"]
richtig eingestellt.Sie müssen es erneut füllen, wahrscheinlich mit demselben Code, der zuvor verwendet wurde. Wiederholen Sie diesen Vorgang:
vor dem
return View(meal)
in der[HttpPost]
Methode.Genau das wird Ihr Problem lösen:
Ich weiß, dass diese Frage sehr alt ist, aber ich bin heute mit dem gleichen Problem hierher gekommen, so dass andere später hierher kommen könnten ...
quelle
Sie erhalten diesen Fehler, wenn die SelectList null ist.
quelle
ModelState.IsValid==false
sodass Sie das Modell zurückgeben,return View(model)
aber Ihre SelectList-Quelle nicht neu füllen, bevor Sie vom POST zurückkehren. Da es keinen ViewState ala WebForms gibt, gibt es keine Quelle für den@Html.DropDown
Helfer, mit der er die Auswahl neu erstellen kann . Sie müssen diese Quellliste jedes Mal füllen, wenn Sie die Ansicht nicht nur auf dem GET an den Client zurückgeben.Ich bin gerade auf dieses Problem gestoßen und dieser Artikel hat mir dabei geholfen - http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx
Die wahrscheinlichste Ursache dafür ist, dass Ihre Sammlung nach dem po wieder aufgefüllt wird
quelle
Wenn Sie für zukünftige Leser Rasiermesser verwenden, versuchen Sie, den Typ des Auswahllistenelements von Liste in IEnumerable zu ändern.
Von
Zu
quelle
Fügen Sie als ersten Parameter eine Zeichenfolge für den Namen Ihrer Dropdown-Liste hinzu und entfernen Sie das Element aus Ihren Ansichtsdaten:
Hier ist auch eine Erweiterungsmethode, die Sie verwenden können, damit die Dropdown-Liste in einem ähnlichen Stil eingerichtet wird wie bei Ihren anderen Steuerelementen:
Beispielsweise
quelle
Sie legen die Sammlung als Element im ViewData-Wörterbuch fest und versuchen, sie als Eigenschaft für das Modell abzurufen. Eine einfache Lösung wäre, auf dieselbe Weise zu verweisen, wie Sie es festgelegt haben:
Alternativ verwendet der folgende Code eine stark typisierte Ansicht:
Dann in Ihrer stark getippten Ansicht:
quelle
Wenn Sie die
Html.DropDownList()
Methode verwenden, kann derselbe Fehler auftreten, wenn Ihr ViewData / Viewbag-Element nicht festgelegt ist, wie @Peto geantwortet hat.Es kann jedoch sein, dass es nicht richtig eingestellt ist, wenn das Controller-Set-Element korrekt eingestellt ist. In der Hauptansicht verwenden Sie jedoch einen partiellen viw-Aufruf mit neuen ViewDataDictionary-Werten.
Wenn Sie
@Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })
dann haben, wird Ihre Teilansicht nicht sehenViewData
undViewBag
Daten, entfernen Sienew ViewDataDictionary()
Parameterquelle
An zukünftige Leser,
Ich bin heute auf das Problem gestoßen und konnte es nicht beheben. Es wurde schließlich wirklich einfach. Ich habe mit einer Tabelle + Ansicht gearbeitet. Als ich die Tabelle aktualisiert habe (einige Spalten hinzugefügt), habe ich vergessen, die Ansicht zu aktualisieren (löschen und neu erstellen), was das Problem für mich verursacht hat. Hoffe es hilft jemandem.
quelle
Ich habe heute den gleichen Fehler erhalten und meine Lösung besteht darin, das Modell "gültig" zu machen.
In meinem Fall wurde nach dem Senden durch den Benutzer durch Klicken auf "Speichern" der Modellstatus angezeigt: ungültig, wenn der Benutzer "0" eingibt, aber der Modellstatus ist gültig, wenn der Benutzer "0.0" eingibt.
Also überschreibe ich die "IsValid" -Methode, um true zurückzugeben, auch wenn der Benutzer "0" eingibt.
Ich hoffe es hilft.
quelle