2016-09-27 9 views
-2

userList viewbag.iから値を取得しようとしていますが、解決策を見つけることができません。エラーは次のとおりです。ViewBag.userListは は、Viewbag mvcからforeachで値を取得できません。

@foreach (var aUser in ViewBag.userList) 
{ 
    <tr> 
     <td>@aUser.name</td> 
     <td>@aUser.username</td> 
     ..... 
     <td>@Html.ActionLink("Edit", "UserEdit","Users")</td> 
     <td>@Html.ActionLink("Delete", "UserDelete", "Users")</td> 
    </tr> 
} 

をデバッグしながら、私はスーパークラスとchildclass

スーパークラスを持って見ることができるデータ(2オブジェクト)を含んで

An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code

Additional information: 'object' does not contain a definition for 'name'

かかわら

public partial class user 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string username { get; set; } 
    ... 
    public string user_role { get; set; } 
} 

子クラス

public class UserSub: user 
{ 
    public string CreatedUserName { get; set; } 
    public string ModifiedUserName { get; set; } 

} 

私のコントローラでは、私はlinqを使ってデータベースから値を取得し、それをViewbag.userListに保存しました。私のコントローラ機能は

public ActionResult UserList() 
{ 
    IEnumerable<user> users = null; 
    users = dbEntities.users.ToList(); 

    if (users != null) 
    { 
     var userLists = (from a in users join b in users on a.created_user_id equals b.id select new { a.name, a.username, a.password, a.user_role, a.is_enable, a.is_approved, CreatedUserName = b.name, a.create_time, a.is_android, a.device_id }).ToList(); 
     ViewBag.userList = userLists; 
    } 
    return View(); 
} 

は、ビューとコントローラの間でデータを共有するためにのViewModelを使用して、あまりにも

+2

'ViewBag.userList'は匿名オブジェクトのコレクションなので、データをモデルに投影する必要があります(プロパティ 'name'、' username'、 'password'などを含みます)。 'ViewBag'を使用しないでください - モデルをビューに渡してください) –

+0

はキャストしようとしましたが、エラーもあります –

+0

なぜモデルに' return View(userLists); ViewBag – Vijai

答えて

0

をエラーを取得.... List<UserSub> users=ViewBag.userListを試しています。例えば

、最初ViewModelにを作成します。

public class userViewModel{  
    public int id { get; set; } 
    public string name { get; set; } 
    public string username { get; set; } 
    public string user_role { get; set; } 
    public string CreatedUserName { get; set; } 
    public string ModifiedUserName { get; set; } 
    ... 
} 

あなたはあなたのビューモデルに必要なすべてのデータを置くことができます...その後、私はあなたとあなたのモデルにクラスを作成することをお勧めします必要なすべてのクエリ(操作方法を調べる必要があります)が、コントローラからクエリを取得できます(必要な場合)。

まあ、あなたのコントローラ機能編集:

public ActionResult UserList() 
{ 
    List<userViewModel> userVM = new List<userViewModel>(); //Important! Don't return all the query, just the data that you need. 
    IEnumerable<user> users = null; 
    users = dbEntities.users.ToList(); 

    if (users != null) 
    { 
     var userLists = (from a in users join b in users on a.created_user_id equals b.id select new { a.name, a.username, a.password, a.user_role, a.is_enable, a.is_approved, CreatedUserName = b.name, a.create_time, a.is_android, a.device_id }).ToList(); //I'm going to suppose that your query is ok and you get all the data that you need... 

     foreach (var item in userLists) 
     { 
      userVM.Add(new userVM(){ 
       userVM.name = item.name; 
       userVM.username = item.username; 
       userVM.user_role = item.user_role; 
       ....... 
      });     
     }    
    } 
    return View(userVM); //return your view model 
} 

を最後に、あなたのビューを変更したり、アイデアだのViewModeluserViewModel

@model Model.ViewModel.userViewModel //It depends on the namespace 
//Then try something likes this... 
@foreach (var aUser in Model) 
{ 
    <tr> 
     <td>@aUser.name</td>    
     <td>@aUser.username</td> 
     ..... 
     <td>@Html.ActionLink("Edit", "UserEdit","Users")</td> 
     <td>@Html.ActionLink("Delete", "UserDelete", "Users")</td> 
    </tr> 
} 

を呼び出して、私の答えを向上させます。 ;)

+1

小さなコメント - 'dbEntities.users'で述語(where句)を置く前に、' ToList() 'を呼びたくないのです。そうでなければ、DBからすべてを選択しています。NETを使用するのではなく、DBエンジンを使用してフィルタを実行する(該当すると仮定して) – Charleh

関連する問題