Доступ к переменным ViewBag в View - PullRequest
0 голосов
/ 13 февраля 2020

Наконец, я перестал спрашивать богов 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

enter image description here

Однако, когда я пытаюсь получить к ним доступ:

enter image description here

enter image description here

Не уверен на 100%, как я должен получить к ним доступ? Я не хочу перебирать их, потому что они помещаются в форму как поля. Как упоминалось ранее, Google Боги были менее чем полезны. Спасибо!

ОБНОВЛЕНИЕ

Я внимательно посмотрел на основе полученных ответов, касающихся кастинга. В конечном итоге я в итоге извлек всю модель и вернул ее в 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

В конечном итоге я был ищем доступ к этим переменным, не повторяя их в al oop. Когда я добавляю оператор SELECT в свой запрос, он начинает жаловаться, что я пытаюсь привести анонимные строки к объекту модели. Можно ли получить выбранные данные из модели в ASP, или вам нужно вернуть весь набор моделей? Теперь это просто любопытство. Спасибо за руководство!

1 Ответ

1 голос
/ 14 февраля 2020

С объектом анонимного типа в 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;
}
...