ASP.NET MVC: как обрабатывать данные модели, которые должны передаваться в каждое представление?

Итак, если есть какое-то глобальное состояние, которое необходимо отображать для каждого представления приложения MVC... например: IsUserLoggedOn и UserName... каков подходящий способ получения этой информации для каждого представления?

Я понимаю, что эта часть представления должна быть на главной странице или в частичном представлении, добавленном к другим представлениям. Но как лучше убедиться, что «глобальные» данные модели передаются в представление каждый раз со всех соответствующих контроллеров и действий?


person codeulike    schedule 27.10.2010    source источник


Ответы (3)


Задав этот вопрос, я нашел хороший пост в блоге Стива Сандерсона: http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

Он предлагает три различных подхода:

  • Используйте базовый класс контроллера или ActionFilter, чтобы каждый раз добавлять соответствующую модель в коллекцию ViewData[]. Я думаю, что некоторые люди уже предлагали такие вещи.

  • Используйте Html.RenderAction() в представлении... и как он говорит:

Если кто-то скажет вам, что внутренние подзапросы плохи, потому что это «не MVC», то сразу кусайте им морду. Также спросите их, почему они все еще хотят использовать Ajax и даже теги <IMG>, если на то пошло, учитывая, что оба являются формой подзапроса.

  • Используйте «Частичные запросы» (он предоставляет код для этого на его блог), которые позволяют одному контроллеру вкладывать вызовы других контроллеров в своего рода вложенную ViewData структуру.
person codeulike    schedule 27.10.2010

codeulike — см. ответ на аналогичный вопрос, заданный точно в то же время, что и этот:

ASP.NET MVC, отображающий имя пользователя из профиля

в двух словах, в основном создайте базовый контроллер, который наследуется всеми вашими другими контроллерами. базовый контроллер затем имеет функцию переопределения, которая переносится на все «дочерние» контроллеры. вместо того, чтобы дублировать код, взгляните на мой ответ выше и попробуйте.

ваше здоровье...

person jim tollan    schedule 27.10.2010

Вы можете создать базовый класс для модели представления, который содержит общую информацию и наследовать ее для каждой модели представления.

public class ViewModelBase
{
    // shared data
}
public class Page1ViewModel : ViewModelBase
{
    // page 1 data
}

В мастер-странице вы можете использовать этот базовый класс

Inherits="System.Web.Mvc.ViewMasterPage<ViewModelBase>"

и в каждом представлении используйте эти производные классы

Inherits="System.Web.Mvc.ViewPage<Page1ViewModel>"
person Mike Koder    schedule 27.10.2010
comment
Правильно, но как мне каждый раз заполнять эту модель представления? Предположительно с базовым контроллером, верно? - person codeulike; 27.10.2010
comment
Конструктор ViewModelBase/вспомогательный класс/базовый класс контроллера - person Mike Koder; 27.10.2010