Нужен совет по IEnumerable -> 3xIEnumerable

#c# #asp.net-mvc #linq

#c# #asp.net-mvc #linq

Вопрос:

Что лучше?

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);
  

Вид

 <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>
  

или

2) Если я установлю ViewBag.tales на сервере, а затем в режиме просмотра произведу преобразование из динамических данных в IEnumerable и разделю его на 3 столбца?

Сервер

 ViewBag.Tales = tales;
  

Вид

         <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>
  

Комментарии:

1. Почему вы должны использовать во втором случае? Кроме того, каким образом лучше?

2. Bcz после этого я должен использовать. Где((x, i) => i % 3 == 0). Он не работает с динамическими данными, такими как ViewBag . [свойство]

Ответ №1:

Что лучше?

Честно говоря, мне не нравится ни один из этих двух. Они оба используют ViewBag и слабую типизацию. Извините, но лично мне становится плохо, когда я вижу ViewBag / ViewData .

Лично мне нравится использовать модели представлений и строго типизированные представления:

 public class MyViewModel
{
    public IEnumerable<Tale> LeftColumnTales { get; set; }
    public IEnumerable<Tale> CenterColumnTales { get; set; }
    public IEnumerable<Tale> RightColumnTales { get; set; }
}
  

который вы могли бы заполнить в своем действии:

 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);
}
  

и в строго типизированном представлении:

 @model MyViewModel
<div id="left_column">
    @Html.DisplayFor(x => x.LeftColumnTales)
</div>
  

и в соответствующем шаблоне отображения, который будет отображаться для каждого элемента коллекции ( ~/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>
  

И еще лучше, если вам придется повторять это на всех ваших страницах, поместить это в _Layout с использованием дочерних действий, как объяснил Фил Хаак в своем блоге. сообщение.

Ответ №2:

Я не уверен, как ваше приложение структурировано / многоуровнево, но в целом мне нравится отделять логику моего бизнеса / домена от моего кода пользовательского интерфейса. Похоже, что это должно быть в левом / центральном / правом столбце — это строго логика пользовательского интерфейса. В этом случае я бы попросил свой бизнес-уровень получить / создать список всех рассказов, а затем оставить его на уровне пользовательского интерфейса, чтобы разделить его, как бы он ни отображался.

Когда я пытаюсь выяснить, принадлежит ли какая-либо логика уровню пользовательского интерфейса или нет, я представляю, что я собираюсь создать много-много пользовательских интерфейсов (веб, Windows, мобильный телефон, веб-часть sharepoint и т. Д.) И спросить себя, вероятно ли, что логика (например, разделить ее на 3 столбца)будет меняться между пользовательскими интерфейсами. Если ответ «да», то эта логика относится к уровню пользовательского интерфейса.