您可以在您看来执行以下色情内容:
@model IEnumerable<Foo>
<table>
@foreach (var item in from i in Model.Select((value, index) => new { value, index }) group i.value by i.index / 3 into g select g)
{
<tr>
@foreach (var x in item)
{
<td><div class="productsFrame">@x.SomeProperty</div></td>
}
</tr>
}
</table>
或者简单地使用视图模型并在控制器操作中进行分组,这显然是我推荐您的。您需要执行此操作的唯一事实意味着您的视图模型不适合视图的要求,即按 3 对结果进行分组。因此请进行调整。不要通过IEnumerable<Foo>
以你的观点。经过IEnumerable<MyViewModel>
显然 MyViewModel 将包含必要的分组,以便在您的视图中您可以简单地循环,或者因为我讨厌在视图中编写 for 和 foreach 循环,所以只需使用显示模板。他们会处理好一切,您的视图将如下所示:
<table>
@HtmlDisplayForModel()
</table>
看起来比最初的色情内容更好,不是吗?
根据评论部分的要求,这是我如何使用视图模型来实现这一点。
As always在 ASP.NET MVC 应用程序中,您首先定义将反映视图需求的视图模型(我重复一下:显示包含 3 列的表):
public class ItemViewModel
{
public string Title { get; set; }
}
public class MyViewModel
{
public IEnumerable<ItemViewModel> Items { get; set; }
}
然后您转到控制器,该控制器将填充此视图模型并将其传递给视图:
public class HomeController : Controller
{
public ActionResult Index()
{
// Obviously in a real world application the data is your domain model
// and comes from a repository or a service layer depending on the complexity
// of your application. I am hardcoding it here for the
// purposes of the demonstration
var data = Enumerable.Range(1, 30).Select(x => new { Title = "title " + x });
var model =
from i in data.Select((value, index) => new { value, index })
group i.value by i.index / 3 into g
select new MyViewModel
{
Items = g.Select(x => new ItemViewModel { Title = x.Title })
};
return View(model);
}
}
最后编写相应的视图(~/Views/Home/Index.cshtml
):
@model IEnumerable<MyViewModel>
<table>
@Html.DisplayForModel()
</table>
and the ~/Views/Home/DisplateTemplates/MyViewModel.cshtml
显示模板:
@model MyViewModel
<tr>
@Html.DisplayFor(x => x.Items)
</tr>
最后是对应的~/Views/Home/DisplateTemplates/ItemViewModel.cshtml
显示模板:
@model ItemViewModel
<td>@Html.DisplayFor(x => x.Title)</td>
就这样了。简单、干净、遵循良好的实践和惯例。
显然,为了更进一步,您将介绍自动映射器 http://automapper.codeplex.com/执行域模型和视图模型之间的实际映射,您最终将得到一个非常优雅的解决方案,如下所示:
public ActionResult Index()
{
IEnumerable<DomainModel> data = ...
var viewModel = Mapper.Map<IEnumerable<DomainModel>, IEnumerable<MyViewModel>>(data);
return View(viewModel);
}
或者更进一步:
[AutoMap(typeof(IEnumerable<DomainModel>), typeof(IEnumerable<MyViewModel>))]
public ActionResult Index()
{
IEnumerable<DomainModel> data = ...
return View(data);
}
现在我们开始认真做事了。