我如何在Razor中迭代一组对象
本文关键字:一组 对象 迭代 Razor | 更新日期: 2023-09-27 18:01:21
我对使用Razor语法迭代一组对象感到困惑。
比如在控制器中,我设置:
ViewBag.accounts = accounts;
Session["accounts"] = accounts;
和在cshtml页面我想遍历帐户:
@foreach (var account in ViewBag.accounts)
可以很好地工作,但是相同的语法不适用于会话:
@foreach (var account in Session.accounts)
和
@foreach (var account in Session["accounts"])
如何在会话中迭代集合?
Session
不是动态的
相反,它的索引器返回object
。
要在foreach循环中使用它,必须显式地将值强制转换为IEnumerable<T>
:
@foreach (var account in (IEnumerable<SomeType>)Session["accounts"])
Using ViewData
ViewData是一个用字符串作为键访问的对象字典。这意味着我们将编写这样的代码:
在控制器
public ActionResult Index()
{
var softwareDevelopers = new List<string>
{
"Brendan Enrick",
"Kevin Kuebler",
"Todd Ropog"
};
ViewData["softwareDevelopers"] = softwareDevelopers;
return View();
}
View
<ul>
@foreach (var developer in (List<string>)ViewData["softwareDevelopers"])
{
<li>
@developer
</li>
}
</ul>
这不是对你问题的直接回答,但我想为你省去一些麻烦。
正如dwerner所说,这是ViewModel的工作,而不是View的工作。
View应该尽可能不知道它所处的环境。理想情况下,它应该意识到只是:(1)ViewModel,它强烈绑定到(通过@model
声明),和(2)任何HTML Helper函数,你已经在应用程序(基本上这些是扩展方法的HtmlHelper<Tmodel>
)
你的ViewModel应该包含一个List<Account>
,你填充任何ViewBag.accounts
,然后你可以完全忽略Viewbag。在你的视图中,集合不是适当的类型("Account"),所以你可以直接在foreach
循环中与Account对象交互,而不需要从Object
强制转换回来或处理Dynamics
。
拥有"哑"视图和"瘦"控制器使你的大部分逻辑保持在ViewModels中,这样更干净,更容易维护。