不能从Viewbag mvc中获取foreach中的值

本文关键字:foreach 获取 不能 Viewbag mvc | 更新日期: 2023-09-27 18:09:03

我试图从userList viewbag中获取值。我想不出解决办法。错误:

类型为'Microsoft.CSharp.RuntimeBinder '的异常。RuntimeBinderException'在System.Core.dll中发生,但未在用户代码中处理

附加信息:'object'不包含'name'的定义

虽然在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 partial class user
{
    public int id { get; set; }
    public string name { get; set; }
    public string username { get; set; }
    ...
    public string user_role { get; set; }
}

childclass

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

trying List<UserSub> users=ViewBag.userList ....

不能从Viewbag mvc中获取foreach中的值

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

例如,首先创建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
}
最后,修改视图并调用ViewModel userViewModel
@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>
}

就是这个主意,改进我的答案。div;)