2016-12-06 10 views
0

次のエラーが表示されます。辞書にはエラータイプのモデルアイテムが必要です

辞書に渡さモデル項目タイプ「System.Collections.Generic.List`1 [MYAPP.Models.User]」であるが、これ 辞書タイプ 「にSystem.Collectionsのモデル項目が必要.Generic.IEnumerable`1 [MYAPP.Models.ViewModel.AccountViewModel] '。次のように

私のコードは次のとおりです。

のViewModel

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

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エンティティ(あなたのビューモデルクラスとはまったく異なるエンティティクラス)のリストを送信しています。これは、このタイプの不一致エラーが発生する理由です。

あなたの行動方法から正しいタイプを送信する必要があります。あなたは、db.UsersコレクションからAccountViewModelのコレクションを取得するために、linqステートメントで投影を使用することができます。

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をモデル全体に​​配置しました

関連する問題

 関連する問題