1

我对使用 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"])

如何迭代会话中的集合?

4

3 回答 3

4

Session不是动态的。
相反,它的索引器返回object.

要在 foreach 循环中使用它,您必须将值显式转换为IEnumerable<T>

@foreach (var account in (IEnumerable<SomeType>)Session["accounts"])
于 2013-02-27T18:33:40.400 回答
3

这不是您问题的直接答案,但我想为您节省一些痛苦。

正如 dwerner 所说,这是 ViewModel 的工作,而不是 View。

View 应该尽可能不知道它运行的环境。理想情况下,它应该只知道:(1)它强烈绑定到(通过@model声明)的 ViewModel ,以及(2)你的任何 HTML Helper 函数已经进入应用程序(基本上这些是关闭的扩展方法HtmlHelper<Tmodel>

您的 ViewModel 应该包含一个List<Account>您填写的内容ViewBag.accounts,然后您可以完全忽略 Viewbag。在您的视图中,该集合不属于适当的类型(“Account”),因此您可以直接在循环中与 Account 对象进行交互,而foreach无需从.ObjectDynamics

拥有“哑”视图和“瘦”控制器可将大部分逻辑保留在 ViewModel 中,这样更清洁且更易于维护。

于 2013-02-27T20:34:11.853 回答
2

使用视图数据

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>
于 2013-02-27T18:42:57.023 回答