C# 无法从Viewbag mvc获取foreach中的值

C# 无法从Viewbag mvc获取foreach中的值,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我正在尝试从userList viewbag获取值。我无法找到解决方案。错误是: System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理 其他信息:“对象”不包含“名称”的定义 尽管在ViewBag.userList中包含我在调试时可以看到的数据2对象 @foreach (var aUser in ViewBag.userList) { <tr>

我正在尝试从userList viewbag获取值。我无法找到解决方案。错误是:

System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理

其他信息:“对象”不包含“名称”的定义

尽管在ViewBag.userList中包含我在调试时可以看到的数据2对象

@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>
}
儿童班

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();
}
尝试过的列表用户=ViewBag.userList…获取错误太多

使用ViewModel在视图和控制器之间共享数据

例如,首先创建ViewModel:

您可以将所有需要的数据放入视图模型中。。。然后,我建议您在模型中创建一个类,其中包含您需要研究如何执行的所有查询,但如果需要,您可以从控制器获取查询

那么,编辑控制器功能:

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
}

这就是我的想法,改进我的答案

因为ViewBag.userList是匿名对象的集合。您需要将数据投影到包含属性名称、用户名、密码等的模型中,并且不要使用ViewBag-将模型传递给ViewUserList…但是存在错误,您为什么不能尝试将其作为模型返回ViewUserList;而不是在视图中播放到什么?您需要查询。Selectx=>new someModel{..}userLists=从a中的用户加入a中的b用户。created_user_id等于b.id selectc=>new UserSub{name=a.name,username=a.username,password=a.password,user_role=a.user_role,is_enable=a.is_enable,is_approved=a.is_approved,create_time=a.create_time,is_android=a.is_android=a.device_id,CreatedUserName=b.name}.ToList;只是一个小注释-在对dbEntities.users放置谓词where子句之前,您可能不想调用dbEntities.users上的ToList-否则,您将从DB中选择所有内容并在.NET中进行筛选,而不是使用DB引擎进行筛选(假设适用)
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
}
@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>
}