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 Fooi 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ę Bardo częściowego widoku. Zauważ również, że jeśli wartość MyBaris null(nie została zainicjowana), to domyślnie Foozostanie 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 Viewzamiast,return PartialViewwięc to jest coś do sprawdzenia