2016-12-06 48 views
0

我收到以下錯誤消息。字典需要型號錯誤的型號項目

傳遞到詞典中的模型項的類型爲「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; } 
} 

控制器

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()); 
    } 

VIEW

@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

您的剃鬚刀視圖強烈類型爲AccountViewModel類對象的集合。但是,您當前的操作方法代碼正在發送User實體(與您的視圖模型類完全不同的實體類)的列表。這就是你得到這種類型不匹配錯誤的原因。

您應該從您的操作方法發送正確的類型。您可以在您的linq語句中使用投影從db.Users集合中獲取AccountViewModel的集合。

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

上面的代碼將基本上創建AccountViewModel對象的列表和讀取的每個用戶實體對象的Id屬性值,並將其分配到相應的視圖模型對象的Id屬性。如果你想要更多的屬性在視圖中,你也應該映射它們。

例如,如果你同時在實體類和視圖模型一個名字屬性,你可以做到這一點,

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

在你的控制器,用這個模型返回視圖

return View(avm.user.AsEnumerable); 

你的分貝查詢返回一個IQueryable, 你確實把ToList放在整個模型上,而不是在用戶字段上

相關問題