The model item passed into the dictionary is of type .. but this dictionary requires a model item of type

匿名 (未验证) 提交于 2019-12-03 01:49:02

问题:

This question and community wiki answer has been added to assist in closing out numerous unanswered questions as discussed in this meta post.


I have some code and when it executes, it throws an exception saying:

The model item passed into the dictionary is of type Bar but this dictionary requires a model item of type Foo

What does this mean, and how do I fix it?

回答1:

The error means that you're navigating to a view whose model is declared as typeof Foo (by using @model Foo), but you actually passed it a model which is typeof Bar (note the term dictionary is used because a model is passed to the view via a ViewDataDictionary).

The error can be caused by

Passing the wrong model from a controller method to a view (or partial view)

Common examples include using a query that creates an anonymous object (or collection of anonymous objects) and passing it to the view

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 

or passing a collection of objects to a view that expect a single object

var model = db.Foos.Where(x => x.ID == id); return View(model); // passes IEnumerable to a view declared with @model Foo 

The error can be easily identified at compile time by explicitly declaring the model type in the controller to match the model in the view rather than using var.

Passing the wrong model from a view to a partial view

Given the following model

public class Foo {     public Bar MyBar { get; set; } } 

and a main view declared with @model Foo and a partial view declared with @model Bar, then

Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault(); return View(model); 

will return the correct model to the main view. However the exception will be thrown if the view includes

@Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); } 

By default, the model passed to the partial view is the model declared in the main view and you need to use

@Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); } 

to pass the instance of Bar to the partial view. Note also that if the value of MyBar is null (has not been initialized), then by default Foo will be passed to the partial, in which case, it needs to be

@Html.Partial("_Bar", new Bar()) 

Declaring a model in a layout

If a layout file includes a model declaration, then all views that use that layout must declare the same model, or a model that derives from that model.

If you want to include the html for a separate model in a Layout, then in the Layout, use @Html.Action(...) to call a [ChildActionOnly] method initializes that model and returns a partial view for it.



回答2:

Observe if the view has the model required:

View

@model IEnumerable
....

Controller

 [HttpGet]     public ActionResult ListItems()     {         SiteStore site = new SiteStore();         site.GetSites();          IEnumerable sites =             site.SitesList.Select(s => new SiteViewModel             {                 Id = s.Id,                 Type = s.Type             });          return PartialView("_ListItems", sites);     } 

In my case I Use a partial view but function to normal views



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!