Es gibt ein paar Beiträge zu Stack Overflow, aber keine mit einer Antwort, die das Problem in meiner aktuellen Situation zu beheben scheint.
Ich habe eine Seite mit einer Tabelle, jede Zeile hat eine Reihe von Textfeldern und ein Dropdown. Alle Dropdowns müssen dieselben SelectList-Daten verwenden, daher habe ich sie wie folgt eingerichtet:
Regler
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Aussicht
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
Ich habe genau dieses Setup an vielen Stellen verwendet, aber aus irgendeinem Grund erhalte ich in dieser speziellen Ansicht den Fehler:
Es gibt kein ViewData-Element vom Typ 'IEnumerable' mit dem Schlüssel 'submarket_0'.
<%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>
DropDownList dauertIEnumerable<SelectListItem>
.<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
Antworten:
Ok, die Antwort wurde von einigen anderen Posts zu diesem Problem abgeleitet und lautet:
Wenn Ihr
ViewData
aSelectList
den gleichen Namen wie IhrDropDownList
"submarket_0" enthält, füllt der HTML-Helfer Ihr automatischDropDownList
mit diesen Daten, wenn Sie nicht den zweiten Parameter angeben, der in diesem Fall die Quell-SelectList ist.Was mit meinem Fehler passiert ist, war:
Da sich die Tabelle mit den Dropdown-Listen in einer Teilansicht befand und die
ViewData
geändert wurde und nicht mehr die vonSelectList
mir referenzierte enthielt, versuchte dieHtmlHelper
(anstatt einen Fehler auszulösen), die SelectList mit dem Namen "submarket_0" in den ViewData (GRRRR! !!) was es NOCH nicht finden konnte und dann einen Fehler drauf warf :)Bitte korrigiere mich wenn ich falsch liege
quelle
Ajax.ActionLink
. Fügen Sie einfach dieSelectList
Get
zu derActionMethod
, die die Ajax - Aufruf enthält.Alte Frage, aber hier ist eine andere Erklärung des Problems. Diese Fehlermeldung wird auch dann angezeigt, wenn Sie stark typisierte Ansichten haben und ViewData nicht zum Erstellen Ihrer Dropdown-Liste verwenden. Der Grund für den Fehler kann deutlich werden, wenn Sie sich die MVC-Quelle ansehen :
Also, wenn Sie etwas haben wie:
@Html.DropDownList("MyList", Model.DropDownData, "")
Und
Model.DropDownData
ist null, MVC durchsucht Ihre ViewData nach etwas mit dem NamenMyList
und gibt einen Fehler aus, wenn in ViewData kein Objekt mit diesem Namen vorhanden ist.quelle
Ich hatte den gleichen Fehler, ich denke, das Problem ist, dass der Fehlertext verwirrend ist , weil er einen falschen Schlüsselnamen enthält.
In Ihrem Fall sollte "Es gibt kein ViewData-Element vom Typ 'IEnumerable' mit dem Schlüssel" Teilmärkte "" angezeigt werden.
Mein Fehler war eine Rechtschreibfehler im Ansichtscode (Ihre "Teilmärkte"), aber der Fehlertext hat mich verrückt gemacht.
Ich poste diese Antwort, weil ich sagen möchte, dass Leute, die wie ich nach diesem Fehler suchen, das Problem darin besteht, dass sie nicht die IENumerable finden, sondern in der Variablen, nach der sie suchen sollen (in diesem Fall "Teilmärkte"). nicht in dem fehlerhaft angezeigten ("submarket_0") .
Die akzeptierte Antwort ist sehr interessant, aber wie Sie sagten, wird die Konvention angewendet, wenn Sie den 2. Parameter nicht angeben. In diesem Fall wurde er angegeben, aber die Variable wurde nicht gefunden (in Ihrem Fall, weil die Ansichtsdaten ihn nicht hatten, in meinem Fall, weil Ich habe den Variablennamen falsch geschrieben.
Hoffe das hilft!
quelle
Das Problem ist, dass das Zurücksenden beim Klicken auf die Schaltfläche "Senden" erfolgt. Klicken Sie also beim Posten von Daten beim Senden erneut auf Schreiben, bevor Sie View () zurückgeben.
quelle
Überprüfen Sie den Namespace.
Sie können System.Web.Webpages.Html.SelectListItem im Controller anstelle von System.Web.Mvc.SelectListItem zuweisen .
quelle
Das ist auch in Ordnung; Zum Beispiel:
==> In der Datei "NumberController":
==> In der Ansichtsdatei (Create.cshtml):
Wenn wir nun diese Aussage entfernen:
von der Rückseite der folgenden Anweisung (in unserem Controller):
Wir werden diesen Fehler sehen:
Es gibt kein ViewData-Element vom Typ 'IEnumerable' mit dem Schlüssel 'OperatorId'.
* Stellen Sie also sicher, dass diese Aussagen vorhanden sind. * *
quelle
Für mich trat das Problem, das diesen Fehler verursachte, auf, als ich eine neue Zeile in der Datenbank speicherte, aber ein Feld war null. Im Entwurf der Datenbanktabelle ist dieses Feld NICHT NULL. Als ich versuchte, eine neue Zeile mit einem Nullwert für ein Nicht-Null-Feld zu speichern, warf Visual Studio diesen Fehler aus. Daher habe ich sichergestellt, dass dem Feld ein Wert zugewiesen wurde und das Problem behoben wurde.
quelle
In meinem Fall habe ich festgestellt, dass ich die Post-Methode fälschlicherweise als privat festgelegt habe. nach dem Wechsel von privat zu öffentlich.
ändern
Funktioniert jetzt gut.
quelle
Die Ursache widerspricht nicht der Syntax, sondern der unangemessenen Verwendung von Objekten. Der Lebenszyklus von Objekten in ViewData, ViewBag und View Life Cycle ist kürzer als in der Sitzung. In den Formern definierte Daten gehen nach einer Anforderungsantwort verloren (wenn Sie versuchen, nach einer Anforderungsantwort darauf zuzugreifen, erhalten Sie Ausnahmen). Die Formers eignen sich daher zum Übertragen von Daten zwischen View & Controller, während letztere zum Speichern temporärer Daten geeignet sind. Die temporären Daten sollten in der Sitzung gespeichert werden, damit mehrmals darauf zugegriffen werden kann.
quelle
In meinem Fall gab es einen Konflikt in den Namespaces, ich habe:
und
Ich möchte ausdrücklich den Mvc verwenden, also habe ich ihn wie folgt deklariert:
quelle
SelectList
InSystem.Collections.Generic
.