需要有关IEnumerable <item> - > 3xIEnumerable <item>的建议

FSo*_*ou1 0 c# linq asp.net-mvc

什么更好?

1)如果我在服务器上制作3个ViewBag然后使用这个ViewBags渲染我的视图?

服务器

            ViewBag.LeftColumnTales = tales.Where((x, i) => i % 3 == 0);
            ViewBag.CenterColumnTales = tales.Where((x, i) => i % 3 == 1);
            ViewBag.RightColumnTales = tales.Where((x, i) => i % 3 == 2);
Run Code Online (Sandbox Code Playgroud)

视图

<div id="left_column">
    @foreach (var t in ViewBag.LeftColumnTales)
    {
        <div class="item">
            <a href="/narodnie-skazki/@t.PeopleTalesCategory.RouteNameAn/@t.RouteNameAn">@t.NameAn</a> <span>(@(new HtmlString(Html.TimeForReadingHtmlResult((int)t.TimeForReading))))</span>
            @(new HtmlString(Html.PeopleTaleVoterHtmlResult((int)t.Analit)))
        </div>
    }
    <!--end of div.item-->
</div>
Run Code Online (Sandbox Code Playgroud)

要么

2)如果我在服务器上设置ViewBag.tales然后在View上将从动态数据转换为IEnumerable并将其分为3列?

服务器

ViewBag.Tales = tales;
Run Code Online (Sandbox Code Playgroud)

视图

        <div id="left_column">
            @foreach (var t in ((IEnumerable<MVCFairyTales3.Models.AuthorTale>)ViewBag.Tales).Where((x, i) => i % 3 == 0))
            {
                <div class="item">
                    <a href="/avtorskie-skazki/@t.AuthorTalesCategory.RouteNameAn/@t.RouteNameAn">@t.NameAn</a> <span>(@(new HtmlString(Html.TimeForReadingHtmlResult((int)t.TimeForReading))))</span>
                    @(new HtmlString(Html.AuthorTaleVoterHtmlResult((int)t.Analit)))
                </div>
            }    
            <!--end of div.item-->
        </div>
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

什么更好?

说实话,我不喜欢这两个中的任何一个.他们都使用ViewBag和弱打字.我很抱歉,但是当我看到ViewBag/ViewData时,我个人生病了.

我个人喜欢使用视图模型和强类型视图:

public class MyViewModel
{
    public IEnumerable<Tale> LeftColumnTales { get; set; }
    public IEnumerable<Tale> CenterColumnTales { get; set; }
    public IEnumerable<Tale> RightColumnTales { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你可以在你的行动中填充:

public ActionResult Foo()
{
    var model = new MyViewModel
    {
        LeftColumnTales = tales.Where((x, i) => i % 3 == 0),
        CenterColumnTales = tales.Where((x, i) => i % 3 == 1),
        RightColumnTales = tales.Where((x, i) => i % 3 == 2),
    };
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

在强类型视图中:

@model MyViewModel
<div id="left_column">
    @Html.DisplayFor(x => x.LeftColumnTales)
</div>
Run Code Online (Sandbox Code Playgroud)

并在将为collection(~/Views/Shared/DisplayTemplates/Tale.cshtml)的每个元素呈现的相应显示模板中:

@model Tale
<div class="item">
    @Html.ActionLink(
        Model.NameAn, 
        Model.RouteNameAn, 
        Model.AuthorTalesCategory.RouteNameAn
    )
    <span>
        @Html.Raw(Html.TimeForReadingHtmlResult((int)Model.TimeForReading))
    </span>
    @Html.Raw(Html.AuthorTaleVoterHtmlResult((int)Model.Analit))
</div>
Run Code Online (Sandbox Code Playgroud)

如果你不得不在你的页面上重复这一点,那就更好了,就像Phil Haack在他的博客文章中解释的那样,使用子行为把它放在_Layout中.