Diese Frage und die Antwort des Community-Wikis wurden hinzugefügt, um das Schließen zahlreicher unbeantworteter Fragen zu erleichtern, die in diesem Meta-Beitrag behandelt werden .
Ich habe Code und wenn er ausgeführt wird, wird eine Ausnahme ausgelöst, die besagt:
Das an das Wörterbuch übergebene Modellelement ist vom Typ Bar, für dieses Wörterbuch ist jedoch ein Modellelement vom Typ Foo erforderlich
Was bedeutet das und wie behebe ich es?
c#
asp.net-mvc
Gemeinschaft
quelle
quelle
return View
statt bekommenreturn PartialView
, also ist das etwas zu überprüfenAntworten:
Der Fehler bedeutet, dass Sie zu einer Ansicht navigieren, deren Modell als typeof deklariert ist
Foo
(mithilfe von@model Foo
), aber tatsächlich ein Modell übergeben haben, das typeof istBar
(beachten Sie, dass der Begriff Wörterbuch verwendet wird, weil ein Modell über a an die Ansicht übergeben wirdViewDataDictionary
). .Der Fehler kann verursacht werden durch
Übergeben des falschen Modells von einer Controller-Methode an eine Ansicht (oder Teilansicht)
Häufige Beispiele sind die Verwendung einer Abfrage, mit der ein anonymes Objekt (oder eine Sammlung anonymer Objekte) erstellt und an die Ansicht übergeben wird
var model = db.Foos.Select(x => new { ID = x.ID, Name = x.Name }; return View(model); // passes an anonymous object to a view declared with @model Foo
oder Übergeben einer Sammlung von Objekten an eine Ansicht, die ein einzelnes Objekt erwartet
var model = db.Foos.Where(x => x.ID == id); return View(model); // passes IEnumerable<Foo> to a view declared with @model Foo
Der Fehler kann zur Kompilierungszeit leicht identifiziert werden, indem der Modelltyp in der Steuerung explizit deklariert wird, damit er mit dem Modell in der Ansicht übereinstimmt, anstatt ihn zu verwenden
var
.Übergabe des falschen Modells von einer Ansicht an eine Teilansicht
Gegeben das folgende Modell
public class Foo { public Bar MyBar { get; set; } }
und dann eine Hauptansicht, die mit deklariert wurde,
@model Foo
und eine Teilansicht, die mit deklariert@model Bar
wurdeFoo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault(); return View(model);
kehrt das richtige Modell zur Hauptansicht zurück. Die Ausnahme wird jedoch ausgelöst, wenn die Ansicht enthält
@Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); }
Standardmäßig ist das an die Teilansicht übergebene Modell das in der Hauptansicht deklarierte Modell, das Sie verwenden müssen
@Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); }
um die Instanz von
Bar
an die Teilansicht zu übergeben. Beachten Sie auch, dass, wenn der Wert vonMyBar
is istnull
(nicht initialisiert wurde), standardmäßigFoo
an den Teil übergeben wird. In diesem Fall muss dies der Fall sein@Html.Partial("_Bar", new Bar())
Deklarieren eines Modells in einem Layout
Wenn eine Layoutdatei eine Modelldeklaration enthält, müssen alle Ansichten, die dieses Layout verwenden, dasselbe Modell oder ein Modell deklarieren, das von diesem Modell abgeleitet ist.
Wenn Sie den HTML-Code für ein separates Modell in ein Layout aufnehmen möchten, initialisieren Sie im Layout mit, um
@Html.Action(...)
eine[ChildActionOnly]
Methode aufzurufen , die dieses Modell initialisiert und eine Teilansicht dafür zurückgibt.quelle
Model.MyBar
Null ist, können Sie dies tun:@Html.Partial("_Bar", Model.MyBar, new System.Web.Mvc.ViewDataDictionary())
Quelle: https://stackoverflow.com/a/713921/4888725Diese Frage hat bereits eine gute Antwort, aber ich bin in einem anderen Szenario auf denselben Fehler gestoßen : Anzeigen
List
in einer EditorTemplate .Ich habe ein Modell wie dieses:
public class Foo { public string FooName { get; set; } public List<Bar> Bars { get; set; } } public class Bar { public string BarName { get; set; } }
Und das ist meine Hauptansicht :
@model Foo @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) @Html.EditorFor(m => m.Bars)
Und das ist meine Bar EditorTemplate ( Bar.cshtml )
@model List<Bar> <div class="some-style"> @foreach (var item in Model) { <label>@item.BarName</label> } </div>
Und ich habe diesen Fehler bekommen:
Der Grund für diesen Fehler ist, dass das
EditorFor
bereitsList
für Sie iteriert wird. Wenn Sie also eine Sammlung an diese übergeben, wird die Editorvorlage für jedes Element in der Sammlung einmal angezeigt.So habe ich dieses Problem behoben:
Brachte die Stile außerhalb der Editorvorlage in die Hauptansicht :
@model Foo @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) <div class="some-style"> @Html.EditorFor(m => m.Bars) </div>
Und änderte die EditorTemplate ( Bar.cshtml ) in diese:
quelle
Beobachten Sie, ob die Ansicht das erforderliche Modell hat:
Aussicht
@model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel> <div class="row"> <table class="table table-striped table-hover table-width-custom"> <thead> <tr> ....
Regler
[HttpGet] public ActionResult ListItems() { SiteStore site = new SiteStore(); site.GetSites(); IEnumerable<SiteViewModel> sites = site.SitesList.Select(s => new SiteViewModel { Id = s.Id, Type = s.Type }); return PartialView("_ListItems", sites); }
In meinem Fall verwende ich eine Teilansicht, läuft aber in normalen Ansichten
quelle