在视图中访问ViewBag变量

问题描述 投票:0回答:1

最终放弃询问Google Gods ...

我正在尝试从下面的查询访问视图中的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的断点观察器中看到了变量

enter image description here

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

enter image description here

enter image description here

不确定我应该如何访问这些文件?我不想遍历它们,因为它们以字段形式放置在表单中。如前所述,Google Gods的帮助不足。谢谢!

UPDATE

我根据收到的有关选角的回复仔细看了看。最终,我最终要做的是检索整个模型并将其返回到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

最终,我一直在寻找访问这些变量,而无需在循环中对其进行迭代。当我在查询中添加选择语句时,它开始抱怨我正在尝试将匿名字符串转换为模型对象。是否可以从ASP中的模型中检索选择的数据,还是需要返回整个模型集?现在只是好奇。谢谢您的指导!

c# asp.net-mvc viewbag
1个回答
1
投票

使用ViewBag中的匿名类型对象,您不能仅通过使用.运算符来访问其属性。这是因为匿名类型生成为internal。因此,更好的方法是像这样创建具有所需属性的类型(例如,该类型称为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

0
投票

使用ViewBag中的匿名类型对象,您不能仅通过使用.运算符来访问其属性。这是因为匿名类型生成为internal。因此,更好的方法是创建具有所需属性的类型,例如这样(假设该类型称为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
© www.soinside.com 2019 - 2024. All rights reserved.