如何在3次循环迭代后关闭<tr>并打开<tr>?我在.NET 4.0中有MVC 3.我如何计算MVC 3中的循环迭代?
现行代码:
@foreach (var articleOnFirstPage in Model.ArticlesOnFirstSite)
{
<tr>
<td><div class="productsFrame"></div></td>
</tr>
}
Run Code Online (Sandbox Code Playgroud)
我想得到这个:
<tr>
<td><div class="productsFrame"></div></td>
<td><div class="productsFrame"></div></td>
<td><div class="productsFrame"></div></td>
</tr>
<tr>
<td><div class="productsFrame"></div></td>
<td><div class="productsFrame"></div></td>
<td><div class="productsFrame"></div></td>
</tr>
<tr>
<td><div class="productsFrame"></div></td>
<td><div class="productsFrame"></div></td>
<td><div class="productsFrame"></div></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
首先想到的是Phil Haack 更好的foreach循环
使用它你可以获得一个索引,并可以使用它
<ol>
@Model.Each(@<li>Item @item.Index of @(Model.Count() - 1): @item.Item.Title</li>)
</ol>
Run Code Online (Sandbox Code Playgroud)
你特别想要的应该是这样的:
@Model.ArticlesOnFirstSite.Each(@<td><div class="productsFrame"></div></td>@(@item.Index % 3 == 0 ? "</tr><tr>" : ""))
Run Code Online (Sandbox Code Playgroud)
您可以在视图中执行以下色情内容:
@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>
Run Code Online (Sandbox Code Playgroud)
或者只是使用视图模型并在控制器操作中进行分组,这显然是我建议您使用的.您需要执行此操作的唯一事实意味着您的视图模型不适合您的视图要求,即将结果分组3.因此请对其进行调整.不要传递IEnumerable<Foo>给你的观点.通过IEnumerable<MyViewModel>显然MyViewModel将包含必要的分组,以便在您的视图中您可以简单地循环或因为我讨厌写入和视图中的foreach循环只需使用显示模板.他们会处理所有事情,您的视图将如下所示:
<table>
@HtmlDisplayForModel()
</table>
Run Code Online (Sandbox Code Playgroud)
看起来比最初的色情内容更好不是吗?
根据评论部分的要求,我将如何使用视图模型实现此功能.
由于总是在你定义的视图模式,将反映您观的要求启动一个ASP.NET MVC应用程序(我重复是:显示与3列的表):
public class ItemViewModel
{
public string Title { get; set; }
}
public class MyViewModel
{
public IEnumerable<ItemViewModel> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你转到控制器,它将填充并将此视图模型传递给视图:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
最后你写了相应的view(~/Views/Home/Index.cshtml):
@model IEnumerable<MyViewModel>
<table>
@Html.DisplayForModel()
</table>
Run Code Online (Sandbox Code Playgroud)
和~/Views/Home/DisplateTemplates/MyViewModel.cshtml显示模板:
@model MyViewModel
<tr>
@Html.DisplayFor(x => x.Items)
</tr>
Run Code Online (Sandbox Code Playgroud)
最后是相应的~/Views/Home/DisplateTemplates/ItemViewModel.cshtml显示模板:
@model ItemViewModel
<td>@Html.DisplayFor(x => x.Title)</td>
Run Code Online (Sandbox Code Playgroud)
这就是它.简单,干净,遵循良好做法和惯例.
显然,为了更进一步,您将引入AutoMapper来执行域模型和视图模型之间的实际映射,最终将得到一个非常优雅的解决方案,如下所示:
public ActionResult Index()
{
IEnumerable<DomainModel> data = ...
var viewModel = Mapper.Map<IEnumerable<DomainModel>, IEnumerable<MyViewModel>>(data);
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
或者更进一步:
[AutoMap(typeof(IEnumerable<DomainModel>), typeof(IEnumerable<MyViewModel>))]
public ActionResult Index()
{
IEnumerable<DomainModel> data = ...
return View(data);
}
Run Code Online (Sandbox Code Playgroud)
现在我们开始开展认真的业务.
| 归档时间: |
|
| 查看次数: |
8347 次 |
| 最近记录: |