В большом и сложном приложении ASP.NET MVC создается модель всех других классов моделей? - PullRequest
1 голос
/ 05 марта 2012

Я объясню свою точку зрения: Лучше всего создавать представления, строго типизированные с помощью модели. Вы можете использовать только одну модель.

Если вам нужны две модели в виде, вы можете создать два вида и использовать Partial Render, но это не самый лучший вариант.

Другой подход заключается в создании другой модели типа, которая инкапсулирует другие части модели, что вам нужно; для меня это имеет больше смысла.

Тогда у меня такой вопрос: в сложном проекте, когда страница должна взаимодействовать со всеми моделями, а они не имеют прямой реализации, разработчики создают тип, который инкапсулирует все остальные?

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

Для несвязанных частей вашего представления вы можете использовать Html.Action () для вызова действия, которое возвращает частичное представление. Таким образом, логика «области» будет заключена в собственном действии и / или контроллере.

Обновление: я не знаю, действительно ли это лучший метод, но я предпочитаю композицию, а не сложные виды и модели видов. Даже для связанной информации я предпочитаю разбивать ее на более мелкие частичные представления и дочерние действия. На мой взгляд, он обладает следующей гибкостью:

  1. Возможность легко перемещать некоторые частичные представления / дочерние действия на страницу макета
  2. Асинхронно загружать частичное представление с помощью AJAX-запроса
  3. Уменьшена сложность действий контроллера и повышена удобство обслуживания.
  4. Лучшая поддержка условного рендеринга
  5. Разделение интересов

В (4) я имею в виду, что вы можете легко сделать следующее, не усложняя модель представления:

<div class="header">
    @if (loggedInUser.ShowAds) {
        @Html.Action("Header", "Ads")
    }  
</div>

Отвечая на вопрос в вашем комментарии. Учитывая твиттер. Слева есть панель контента и поле для пользователей. Итак, вот наш TweetsController:

public class TweetsController: Controller {
    public ActionResult Index() {
        var tweets = ...;
        return View(tweets);
    }
}

Вид твитов / указателей может выглядеть следующим образом:

@model Tweet[]
<div class="leftPane">
    @Html.Action("Index", "Users");
</div>
<div class="mainContent">
    @foreach var t in Model {
        @t.User - @t.Text
    }
</div>

Обратите внимание, что левая панель просто вызывает действие Index в UsersController для отображения списка пользователей. Вот как это может выглядеть:

 public class UsersController: Controller {
     public ActionResult Index() {
         var users = ...;
         return PartialView(users);
     }
 }

А вот частичное представление (Пользователи / Индекс):

 @model User[]
 @foreach var u in Model {
     <img src="@u.IconUrl"/> @u.Name
 }

Так что же на самом деле произойдет, когда представление Tweets будет отображено как Html.Action поместит частичное представление, возвращенное UsersController.Index, в левую панель. Конечно, вы можете переместить эту логику в макет, если это поведение является общим для нескольких страниц.

Надеюсь, это поможет.

1 голос
/ 05 марта 2012

Тогда мой вопрос в том, что в сложном проекте, когда странице необходимо обмениваться данными со всеми моделями, а они не реализуются напрямую, разработчики создают тип, который инкапсулирует все остальные вещи?

Да, некоторые из них делают, и имя для них ViewModels

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...