Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The model item is of type CookMeIndexViewModel, but requires a model item of type IEnumerable<CookMeIndexViewModel>

I am following along with the music store example to try learn ASP.NET MVC. I'm creating a cookbook application.

I have created my viewmodel that looks like this:

namespace CookMe_MVC.ViewModels {     public class CookMeIndexViewModel     {         public int NumberOfReceipes { get; set; }         public List<string> ReceipeName { get; set; }     } } 

my controller looks like this

public ActionResult Index()     {         var meals= new List<string> { "Dinner 1", "Dinner 2", "3rd not sure" };        //create the view model         var viewModel = new CookMeIndexViewModel         {             NumberOfReceipes = meals.Count(),             ReceipeName = meals         };         return View(viewModel);     } 

Finally my view looks like this

 @model IEnumerable<CookMe_MVC.ViewModels.CookMeIndexViewModel>  @{     ViewBag.Title = "Index"; }  <h2>Index</h2>  <p>     @Html.ActionLink("Create New", "Create") </p> <table>     <tr>         <th></th>         <th>             Meals         </th>     </tr>  @foreach (var item in Model) {     <tr>         <td>             @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |             @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |             @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })         </td>         <td>             @item.ReceipeName         </td>     </tr> }  </table> 

I get this error.

The model item passed into the dictionary is of type CookMeIndexViewModel, but this dictionary requires a model item of type IEnumerable<CookMeIndexViewModel>.

I have followed the example. I can't see what I am doing wrong. Should I be returning my viewmodel as a generic list?

like image 377
Diver Dan Avatar asked Jan 27 '11 06:01

Diver Dan


People also ask

What is the model item passed to the viewdatadictionary?

- Microsoft Q&A The model item passed into the ViewDataDictionary is of type 'EntityCrudIdentity.ViewModels.MemberViewModel', but this ViewDataDictionary instance requires a model item of type 'EntityCrudIdentity.ViewModels.EditMemberViewModel'. The error is very clear.

What is the model item of the dictionary in MVC?

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1 [DB_Payment.Models.GetInvoice]', but this dictionary requires a model item of type 'DB_Payment.Models.GetInvoice'. C# MVC - Microsoft Q&A

Are the @model and @model lines interchangeable?

The two are not interchangeable. You need to either change the @model line in you Razor code or change which object you're adding to the list. Of course, I can't tell you which one to do. … Download, Vote, Comment, Publish. Forgot your password? This email is in use. Do you need your password? Submit your solution! Read the question carefully.


2 Answers

In your view you are using @model IEnumerable<CookMe_MVC.ViewModels.CookMeIndexViewModel> which indicates that the model expected by the View is of type IEnumerable of CookMeIndexViewModel.

However in the controller you are passing an object of type CookMeIndexViewModel as a model return View(viewModel); hence the error.

Either change the view to have @model CookMe_MVC.ViewModels.CookMeIndexViewModel

or pass a IEnumerable of CookMeIndexViewModel as model to the view in controller as given below:

public ActionResult Index() {         var meals= new List<string> { "Dinner 1", "Dinner 2", "3rd not sure" };      //create the view model         var viewModel = new CookMeIndexViewModel         {                 NumberOfReceipes = meals.Count(),                 ReceipeName = meals         };         List<CookMeIndexViewModel> viewModelList = new List<CookMeIndexViewModel>();         viewModelList.Add(viewModel);         return View(viewModelList); } 
like image 137
Chandu Avatar answered Sep 18 '22 19:09

Chandu


I got this message when I had a conflict between what the @model directive in the _Layout.cshtml layout view and an "inner page" view.

The _Layout.cshtml had directive..

@model MyProject.Models.MyObject 

My inner page had...

@model IEnumerable<MyProject.Models.MyObject> 

I was working on some test / experiment code and hit this issue when I created new controller etc. It was only when I renamed Model Object and compiled afterwards that I found the source of the problem.

Hope this helps.

Q.

like image 30
David Quinlan Avatar answered Sep 22 '22 19:09

David Quinlan