在 View 中访问 ViewBag 变量

Accessing ViewBag variables in View

终于放弃求问Google大神了...

我正在尝试从下面的查询访问我视图中的 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 众神帮不上什么忙。 谢谢!

更新

我根据收到的关于选角的回复仔细查看了。最终我最终做的是检索整个模型并将其 return 放入 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 中的模型检索 select 数据,或者您是否需要 return 整个模型集?现在只是好奇。 谢谢指导!

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

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