2016-11-02 15 views

Odpowiedz

21

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.

+0

+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

1

przestrzegać jeśli widok ma model Wymagane:

View

@model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel> 

<div class="row"> 
    <table class="table table-striped table-hover table-width-custom"> 
     <thead> 
      <tr> 
.... 

Controller

[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); 
    } 

W moim przypadku używam częściowy widok, ale funkcję normalnych widoków

+0

Co to ma wspólnego z pytaniem? –

+1

@StephenMuecke this champs - Element modelu przekazany do słownika jest typu Bar, ale ten słownik wymaga elementu modelu typu Foo – CelzioBR