Błąd oznacza, że nawigujesz do widoku, którego model jest zadeklarowany jako typeof Foo
(przy użyciu @model Foo
), ale w rzeczywistości przekazałeś mu model, który jest typeof Bar
(zwróć uwagę, że używany jest termin słownik, ponieważ model jest przekazywany do widoku za pośrednictwem a ViewDataDictionary
) .
Błąd może być spowodowany przez
Przekazywanie niewłaściwego modelu z metody kontrolera do widoku (lub częściowego widoku)
Typowe przykłady obejmują użycie zapytania, które tworzy anonimowy obiekt (lub kolekcję obiektów anonimowych) i przekazanie go do widoku
var model = db.Foos.Select(x => new
{
ID = x.ID,
Name = x.Name
};
return View(model);
lub przekazanie kolekcji obiektów do widoku, który oczekuje pojedynczego obiektu
var model = db.Foos.Where(x => x.ID == id);
return View(model);
Błąd można łatwo zidentyfikować w czasie kompilacji, jawnie deklarując typ modelu w kontrolerze, aby pasował do modelu w widoku, zamiast używać var
.
Przekazywanie niewłaściwego modelu z widoku do częściowego widoku
Biorąc pod uwagę następujący model
public class Foo
{
public Bar MyBar { get; set; }
}
a głównym widoku zadeklarowana @model Foo
i częściowym widokiem zadeklarowana @model Bar
, a następnie
Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault();
return View(model);
zwróci prawidłowy model do widoku głównego. Jednak wyjątek zostanie zgłoszony, jeśli widok zawiera
@Html.Partial("_Bar")
Domyślnie model przekazany do widoku częściowego jest modelem zadeklarowanym w widoku głównym i należy go użyć
@Html.Partial("_Bar", Model.MyBar)
przekazać instancję Bar
do częściowego widoku. Zauważ również, że jeśli wartość MyBar
is null
(nie została zainicjowana), to domyślnie Foo
zostanie przekazana do częściowej, w takim przypadku musi być
@Html.Partial("_Bar", new Bar())
Deklarowanie modelu w układzie
Jeśli plik układu zawiera deklarację modelu, wszystkie widoki korzystające z tego układu muszą deklarować ten sam model lub model pochodzący z tego modelu.
Jeśli chcesz dołączyć @Html.Action(...)
kod HTML dla oddzielnego modelu do układu, to w układzie użyj, aby wywołać [ChildActionOnly]
metodę inicjuje ten model i zwraca dla niego częściowy widok.
return View
zamiast,return PartialView
więc to jest coś do sprawdzenia