c# - 在 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 中的模型中检索选择数据,或者您是否需要返回整个模型集?现在只是好奇。感谢您的指导!
解决方案
对于 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;
}
推荐阅读
- javascript - 如何使 html 页面文本和表格响应(使用 javascript)
- python - 字典中的python函数for循环
- android - 如何跳过由 androids CAMERA_ACTIVITY 创建的活动?
- image-processing - 是否有使用 Moravec Operator 进行角点检测的完整解释(带有伪代码)?
- angular - 单元测试未运行 Angular4
- javascript - () 括号,它在 JavaScript 中 ({__proto__: []} instanceof Array) 的语句中做了什么
- database-migration - 使用 TypeORM 迁移,我如何指定特定的连接?
- vba - 如何为许多 Outlook 子文件夹实施 ItemChange?
- webpack - Quasar Framework 中 TweenMax 的 GSAP 模块问题
- node.js - 本机js如何找到另一个字段等于某个值的集合的字段名称