Для несвязанных частей вашего представления вы можете использовать Html.Action () для вызова действия, которое возвращает частичное представление.
Таким образом, логика «области» будет заключена в собственном действии и / или контроллере.
Обновление: я не знаю, действительно ли это лучший метод, но я предпочитаю композицию, а не сложные виды и модели видов. Даже для связанной информации я предпочитаю разбивать ее на более мелкие частичные представления и дочерние действия. На мой взгляд, он обладает следующей гибкостью:
- Возможность легко перемещать некоторые частичные представления / дочерние действия на страницу макета
- Асинхронно загружать частичное представление с помощью AJAX-запроса
- Уменьшена сложность действий контроллера и повышена удобство обслуживания.
- Лучшая поддержка условного рендеринга
- Разделение интересов
В (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, в левую панель.
Конечно, вы можете переместить эту логику в макет, если это поведение является общим для нескольких страниц.
Надеюсь, это поможет.