我如何迭代Razor中的一组对象?

时间:2013-02-27 18:31:39

标签: c# asp.net-mvc razor

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

如何在会话中迭代集合?

3 个答案:

答案 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>