首页 > 解决方案 > 在 View 中访问 ViewBag 变量

问题描述

终于放弃问谷歌大神了……

我正在尝试从下面的查询中访问视图中的 ViewBag 变量。

using (var context = new PrincipalContext(ContextType.Domain))
{
    var un = UserPrincipal.FindByIdentity(context, User.Identity.Name);
    var userinfo = db.Users
                     .Where(x => x.sAMAccountName == un.SamAccountName)
                     .Select(x => new
                      {
                          x.sAMAccountName,
                          x.Id
                      }).First();

    ViewBag.UserInfo = userinfo;
}

我在 VS 的断点观察器中看到了变量

在此处输入图像描述

但是,当我尝试访问它们时:

在此处输入图像描述

在此处输入图像描述

不能 100% 确定我应该如何访问这些?我不想遍历它们,因为它们被放置在表单中作为字段。如前所述,Google Gods 的帮助不大。谢谢!

更新

我根据收到的回复仔细研究了有关选角的问题。最终我最终做的是检索整个模型并将其返回到 ViewBag 中,然后像这样访问它:

using (var context = new PrincipalContext(ContextType.Domain))
{
     var un = UserPrincipal.FindByIdentity(context, User.Identity.Name);
     User info = new User();
     info = (User)db.Users
                .Where(x => x.sAMAccountName == un.SamAccountName)
                .First();
      ViewBag.User = info;

}

然后在视图中

@ViewBag.User.Id
@ViewBag.User.sAMAccountName

最终,我希望访问这些变量而不在循环中迭代它们。当我在查询中添加一个 select 语句时,它开始抱怨我试图将匿名字符串转换为模型对象。是否能够从 ASP 中的模型中检索选择数据,或者您是否需要返回整个模型集?现在只是好奇。感谢您的指导!

标签: c#asp.net-mvcviewbag

解决方案


对于 ViewBag 中的匿名类型对象,您不能仅通过使用.运算符来访问它们的属性。那是因为匿名类型生成为internal. 所以更好的方法是创建一个具有所需属性的类型,就像这样(比如这个类型被称为UserInfo)。通过创建仅包含视图所需属性的单独类型,您可以优化查询以仅从数据库中选择这些字段(一种常见做法)。

ViewBag.UserInfo = db.Users
                     .Where(x => x.sAMAccountName == un.SamAccountName)
                     .Select(x => new UserInfo // the object is now of type UserInfo
                     {
                         sAMAccountName = x.sAMAccountName,
                         Id = x.Id
                     }).First();

然后在视图文件中,您可以像这样使用强制转换访问属性:

(UserInfo(ViewBag.UserInfo)).sAMAccountName

在视图文件中使用反射访问属性的丑陋方式(不要这样做):

@{
    string name = ViewBag.UserInfo.GetType().GetProperty("sAMAccountName").GetValue(ViewBag.UserInfo) as string;
}

推荐阅读