You can do the following pornography in your opinion:
@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> . Pass IEnumerable<MyViewModel>, , MyViewModel , , , foreach- . , :
<table>
@HtmlDisplayForModel()
</table>
, ?
, .
ASP.NET MVC , ( : ):
public class ItemViewModel
{
public string Title { get; set; }
}
public class MyViewModel
{
public IEnumerable<ItemViewModel> Items { get; set; }
}
, :
public class HomeController : Controller
{
public ActionResult Index()
{
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>
~/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>
. , , .
, , AutoMapper, , , :
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);
}
.