首页 文章

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

提问于
浏览
-2

我试图从userList viewbag.i获取值无法找出解决方案 . 错误是:

System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理附加信息:“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();
}

试过 List<UserSub> users=ViewBag.userList ....也得到了错误

1 回答

  • 0

    使用 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; }
       ...
    }
    

    您可以在视图模型中放置所需的所有数据...然后,我建议您在模型中创建一个包含所需的所有查询的类(您必须调查如何操作),但是您可以获得来自控制器的查询(如果需要) .

    好吧,编辑你的 controller 函数:

    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
    }
    

    最后,修改 view 并调用 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>
    }
    

    这是想法,改善我的答案 . ;)

相关问题