我对使用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"])
如何在会话中迭代集合?
答案 0 :(得分:4)
Session
不是动态的
相反,它的索引器返回object
。
要在foreach循环中使用它,必须将值显式转换为IEnumerable<T>
:
@foreach (var account in (IEnumerable<SomeType>)Session["accounts"])
答案 1 :(得分:3)
这不是你问题的直接答案,但我想为你省一些痛苦。
正如dwerner所说,这是ViewModel 的工作,而不是View。
View应该尽可能地对其运行的环境一无所知。理想情况下应该只知道:(1)它强烈绑定到的ViewModel(通过@model
声明)< / em>,以及(2)您在应用中获得的任何HTML帮助程序功能(基本上这些是HtmlHelper<Tmodel>
之外的扩展方法)
您的ViewModel应该包含List<Account>
,您可以使用ViewBag.accounts
填充任何内容,然后您可以完全忽略Viewbag。在您的视图中,该集合不属于相应的类型(“帐户”),因此您可以直接在foreach
循环中与帐户对象进行互动,而无需从Object
退回或处理Dynamics
拥有“哑”视图和“瘦”控制器可以在ViewModel中保留大部分逻辑,这些逻辑更清晰,更易于维护。
答案 2 :(得分:1)
使用ViewData
ViewData是可以使用字符串作为键访问的对象的字典。这意味着我们将编写如下代码:
在控制器
中public ActionResult Index()
{
var softwareDevelopers = new List<string>
{
"Brendan Enrick",
"Kevin Kuebler",
"Todd Ropog"
};
ViewData["softwareDevelopers"] = softwareDevelopers;
return View();
}
在视图中
<ul>
@foreach (var developer in (List<string>)ViewData["softwareDevelopers"])
{
<li>
@developer
</li>
}
</ul>