我收到以下错误。
传递到字典中的模型项的类型为'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>
答案 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放在整个模型上,而不是放在用户字段上