字典需要类型错误的模型项

时间:2016-12-06 17:39:46

标签: c# asp.net-mvc linq

我收到以下错误。

  

传递到字典中的模型项的类型为'System.Collections.Generic.List`1 [MYAPP.Models.User]',但是这个   字典需要类型的模型项   'System.Collections.Generic.IEnumerable`1 [MYAPP.Models.ViewModel.AccountViewModel]'。

我的代码如下:

视图模型

public class AccountViewModel
{
    ...
    public IQueryable<User> user { get; set; }
}

CONTROLLER

public class UserController : Controller
{
    private REc db = new REc();

    // GET: /User/
    public ActionResult Index()
    {
        AccountViewModel avm = new AccountViewModel();
        var users = db.Users.Include(u => u.USERROLE);
        avm.user = users;
        return View((avm.user).ToList());
    }

查看

@model IEnumerable<SNAPAPP.Models.ViewModel.AccountViewModel>

@{
    ViewBag.Title = "Index";
}
    <table class="table">
    <tr>

        <th>
            @Html.DisplayNameFor(model => model.USERROLE)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>

        <td>
            @Html.DisplayFor(modelItem => item.USERROLE)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

2 个答案:

答案 0 :(得分:2)

您的剃刀视图强烈输入AccountViewModel类对象的集合。但是您当前的操作方法代码是发送User实体列表(实体类与视图模型类完全不同)。这就是您遇到此类型不匹配错误的原因。

您应该从您的操作方法发送正确的类型。您可以在linq语句上使用projection来从db.Users集合中获取AccountViewModel的集合。

var accountViewModelList = db.Users
                             .Select(x=> new AccountViewModel { Id=x.Id }) 
                             .ToList();
return View(accountViewModelList);

上面的代码基本上会创建一个AccountViewModel对象列表,并读取每个User实体对象的Id属性值,并将其分配给相应的视图模型对象的Id属性。如果您想在视图中添加更多属性,也应该映射这些属性。

例如,如果实体类和视图模型中都有FirstName属性,则可以执行此操作,

var accountViewModelList = db.Users
                             .Select(x=> new AccountViewModel { 
                                                               Id=x.Id,
                                                               FirstName = x.FirstName }) 
                             .ToList();

答案 1 :(得分:0)

在控制器中,使用它将模型返回到视图

return View(avm.user.AsEnumerable);

你的db查询返回一个IQueryable, 你确实把ToList放在整个模型上,而不是放在用户字段上