我如何在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"])

如何在会话中迭代集合?

我如何在Razor中迭代一组对象

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中,这样更干净,更容易维护。