在 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;
}
终于放弃求问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;
}