Błąd oznacza, że jesteś przechodząc do widoku, który model jest zadeklarowana jako typeof Foo
(za pomocą @model Foo
), ale faktycznie przekazywane mu model, który typeof Bar
(nota termin słowniku jest używany, ponieważ model jest przekazywany do widoku poprzez ViewDataDictionary
).
Błąd może być spowodowany przez
Przechodząc niewłaściwy model z metody kontrolera do widoku (lub częściowy widok)
Typowe przykłady obejmują przy użyciu kwerendy, która tworzy anonimowy obiekt (lub zbiór anonimowych obiektów) i przekazanie go do widoku
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
lub przekazując zbiór obiektów myślą, że spodziewają pojedynczy obiekt
var model = db.Foos.Where(x => x.ID == id);
return View(model); // passes IEnumerable<Foo> to a view declared with @model Foo
Błąd można łatwo zidentyfikować w czasie kompilacji przez wyraźnie deklarując typ modelu w sterowniku, aby dopasować model w widoku zamiast używać var
.
Podanie niewłaściwego modelu z myślą o częściowym widokiem
Biorąc pod uwagę następujący model
public class Foo
{
public Bar MyBar { get; set; }
}
a głównym widoku zadeklarowana z @model Foo
i częściowym widokiem zadeklarowana z @model Bar
, następnie
Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault();
return View(model);
spowoduje zwrócenie prawidłowego modelu do głównego widoku. Jednak zostanie wyrzucony wyjątek, jeśli widok zawiera
@Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); }
Domyślnie model przeszedł do częściowego widzenia jest model zadeklarowana w głównym widoku i trzeba użyć
@Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); }
zdać wystąpienie Bar
do widoku częściowego.Należy również zauważyć, że jeżeli wartość MyBar
jest null
(nie został zainicjowany), wtedy domyślnie Foo
zostaną przekazane do częściowego, w tym przypadku, to musi być
@Html.Partial("_Bar", new Bar())
Deklarowanie model w układzie
Jeśli plik układu zawiera deklarację modelu, wówczas wszystkie widoki korzystające z tego układu muszą zadeklarować ten sam model lub model, który pochodzi z tego modelu.
Jeśli chcesz dołączyć HTML do oddzielnego modelu w układzie, a następnie w layoucie, użyj @Html.Action(...)
, aby wywołać metodę [ChildActionOnly]
, która inicjuje ten model i zwraca dla niego widok częściowy.
+1 dla "Zauważ również, że jeśli wartość MyBar ma wartość null (nie została zainicjowana), wówczas domyślnie Foo zostanie przekazane częściowemu, w którym to przypadku musi być". Bardzo ważna uwaga. – Smix