Passing the correct type from the controller to the view?

This error message was received while trying to load a view:

The model item passed into the dictionary is of type
'System.Data.Entity.Infrastructure.DbQuery`1[<>f__AnonymousType0`2[System.Int32,System.String]]',
but this dictionary requires a model item of type
'System.Collections.Generic.IEnumerable`1[HelloWorld.Models.P]'.

Could this not pass the correct type from the controller to the view?

Here is the model:

public class P
{
    [Key]
    public virtual int ImportID { set; get; }
    public virtual string MicroName { set; get; }
}

Here is the definition of DBContext:

public DbSet<P> Ps { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  //REMAPPING TABLE NAMES 
  modelBuilder.Entity<P>()
.ToTable("SomeTable_With_Really_LongName_tbl");

base.OnModelCreating(modelBuilder);
}

Here's the Controller action:

public ActionResult ListP()
{

var model = (from p in _db.Ps
 select new
 {
p.ImportID,
 p.MicroName
 }).Take(10);

return View(model);
}

Here is the view:

@model IEnumerable<HelloWorld.Models.P>

@{
    ViewBag.Title = "List P";
}

<h2>List P</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            ImportID
        </th>
        <th>
            MicroName
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ImportID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MicroName)
        </td>
        <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>
</tr>
}

</table>

Any ideas?

0
source share
2 answers

think that

var model = (from p in _db.Ps
 select new
 {
p.ImportID,
 p.MicroName
 }).Take(10);

returns the id of the import and the name where it should return the enumerator P

var model = _db.Ps.OrderBy(f => f.[FieldName]).Take(10);
+1
source

You get this exception because View expects a type model IEnumerable<HelloWorld.Models.P>, but you pass it a model, which is a collection of an anonymous type.

In the controller, try the following:

public ActionResult ListP()
{
    var model = (from p in _db.Ps
                select p).Take(10);

    return View(model);
}

OR

public ActionResult ListP()
{
    var model = (from p in _db.Ps
                select new P
                {
                    ImportID = p.ImportID,
                    MicroName = p.MicroName
                }).Take(10);

    return View(model);
}
0
source

All Articles