I am trying to display a list in a View, how to fix this error?
The model item passed into the dictionary is of type
‘System.Data.Objects.ObjectQuery1[System.Linq.IGrouping2[System.Int32,mvc3Post.Models.Contact]]’,
but this dictionary requires a model item of type
‘System.Collections.Generic.IEnumerable`1[mvc3Post.Models.Contact]’.
controller:
public ActionResult Index()
{
AdventureWorksEntities db = new AdventureWorksEntities();
var result = from soh in db.SalesOrderHeaders
join co in db.Contacts
on soh.ContactID equals co.ContactID
orderby co.FirstName
group co by co.ContactID into g
select g;
return View(result.AsEnumerable());
}
view:
@model IEnumerable<mvc3Post.Models.Contact>
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
NameStyle
</th>
<th>
Title
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.NameStyle)
</td>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.ContactID }) |
@Html.ActionLink("Details", "Details", new { id = item.ContactID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.ContactID })
</td>
</tr>
}
</table>
Updated now that I see the controller method:
You might need to transform your LINQ result set into a list or something (e.g.,
contacts.ToList()) more concrete.Another alternative might be to create a root object for your page’s list object to live on. I find it a little easier to follow and maintain if each View has a corresponding Model class that represents it’s entire state.
I think either route will resolve your issue though. I think that the latter is probably the better way if I had to recommend one vs the other.