it-swarm.com.de

Es gibt kein ViewData-Element vom Typ "IEnumerable <SelectListItem>" mit dem Schlüssel "xxx".

Es gibt einige Posts zu diesem Thema auf Stack Overflow, aber keine mit einer Antwort, die das Problem in meiner aktuellen Situation zu beheben scheint.

Ich habe eine Seite mit einer Tabelle darin, jede Zeile hat eine Anzahl von Textfeldern und eine Dropdown-Liste. Alle Dropdowns müssen dieselben SelectList-Daten verwenden, daher habe ich sie wie folgt eingerichtet:

Controller

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

Ansicht

<%= 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 bestimmten Ansicht den Fehler:

Es gibt kein ViewData-Element vom Typ "IEnumerable" mit dem Schlüssel "submarket_0".

84
Jimbo

Ok, die Antwort wurde von einigen anderen Posts zu diesem Problem abgeleitet und lautet:

Wenn Ihr ViewData ein SelectList mit demselben Namen wie Ihr DropDownList enthält, dh "submarket_0", füllt der Html-Helfer Ihr DropDownList automatisch mit diesen Daten - Wenn Sie den 2. Parameter nicht angeben In diesem Fall ist dies die Quellenauswahlliste.

Was mit meinem Fehler passiert ist, war:

Da sich die Tabelle mit den Dropdown-Listen in einer Teilansicht befand und das ViewData geändert worden war und nicht mehr das SelectList enthielt, auf das ich verwiesen hatte, das HtmlHelper (anstatt es zu werfen) ein Fehler) versuchte, die SelectList mit dem Namen "submarket_0" in den ViewData (GRRRR !!!) zu finden, die sie NOCH nicht finden konnte, und warf dann einen Fehler darauf :)

Bitte korrigiere mich wenn ich falsch liege

76
Jimbo

Alte Frage, aber hier ist eine andere Erklärung des Problems. Dieser Fehler tritt auch dann auf, 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:

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

Wenn Sie also etwas haben wie:

@Html.DropDownList("MyList", Model.DropDownData, "")

Und Model.DropDownData Ist null, MVC durchsucht Ihre ViewData nach etwas mit dem Namen MyList und gibt einen Fehler aus, wenn in ViewData kein Objekt mit diesem Namen vorhanden ist.

27
hawkke

Ich hatte den gleichen Fehler, ich denke, das Problem ist, dass der Fehlertext ist verwirrend, weil es einen falschen Schlüsselnamen gibt.

In Ihrem Fall sollte "Es gibt kein ViewData-Element vom Typ" IEnumerable "mit dem Schlüssel" Submarkets "".

Mein Fehler war ein 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 nach diesem Fehler suchen, wie ich es war, das Problem darin besteht, dass es findet nicht die IENumerable, sondern in der var, nach der es suchen soll) ("Submarkets" in in diesem Fall), nicht in dem fehlerhaften ("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 sie angegeben, aber die Variable wurde nicht gefunden (in Ihrem Fall, weil die Ansichtsdaten sie nicht hatten, in meinem Fall, weil Ich habe den Variablennamen falsch geschrieben

Hoffe das hilft!

15
Peto

Das Problem liegt daran, dass das Zurückschicken beim Senden über die Schaltfläche erfolgt. Wenn Sie also Daten auf "Senden" posten, klicken Sie erneut, und schreiben Sie, bevor Sie "Anzeigen" () zurückgeben.

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
8
rakesh

Überprüfen Sie den Namespace.

Sie können System.Web.Webpages.Html.SelectListItem im Controller anstelle von System.Web.Mvc.SelectListItem zuweisen.

3
MovGP0

Das ist auch in Ordnung; Beispielsweise:
==> In der Datei "NumberController":

public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number)
{
    if (ModelState.IsValid)
    {
        ...
        ...
        return RedirectToAction("Index");
    }
    ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", 
                                "OperatorSign", number.OperatorId);                
    return View();
}

==> In der View-Datei (Create.cshtml):

<div class="form-group">
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = 
                   "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { 
                        @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Number1, "", new { @class = 
                                   "text-danger" })
    </div>
</div>

Nun, wenn wir diese Anweisung entfernen:

ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);

von der Rückseite der folgenden Anweisung (in unserem Controller):

return View();

wir werden diesen Fehler sehen:

Es gibt kein ViewData-Element vom Typ "IEnumerable" mit dem Schlüssel "OperatorId".

* Stellen Sie daher sicher, dass diese Aussagen vorhanden sind. *

1
Morteza

In meinem Fall habe ich fälschlicherweise festgestellt, dass ich die Post-Methode als privat festgelegt habe. nach dem Wechsel von privat zu öffentlich.

[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}

ändern

[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}

Jetzt funktioniert gut.

0
Mohammed Sabbir

Für mich ist das Problem, das diesen Fehler verursacht hat, aufgetreten, als ich eine neue Zeile in der Datenbank gespeichert habe, aber ein Feld war null. Im Design der Datenbanktabelle ist dieses Feld NICHT NULL. Als ich also versuchte, eine neue Zeile mit einem Nullwert für ein Nicht-Null-Feld zu speichern, warf Visual Studio diesen Fehler auf. So habe ich sichergestellt, dass dem Feld ein Wert zugewiesen wurde und das Problem behoben wurde.

0
Thuy