MVC Master Page Динамические данные - PullRequest
1 голос
/ 15 декабря 2010

У меня есть главная страница, которая должна отображать некоторые данные из моей базы данных.Например, у меня есть заголовок на странице, который будет отображать количество сообщений / предупреждений, которые есть у пользователя.Каждый контроллер должен будет передать эти данные в View.Каков наилучший способ сделать это в приложении MVC.Я, очевидно, не хочу копировать код в каждом действии контроллера.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

Вы можете использовать дочерние действия. Фил Хаак отлично объясняет их в этом блоге . Таким образом, у вас будет специальный контроллер для извлечения данных из репозитория и его частичного просмотра. Затем на своей главной странице вы просто включите действие:

<%= Html.Action("index", "somecontroller") %>

Таким образом, другим контроллерам не нужно передавать данные в представление. У него совершенно отдельный жизненный цикл.

2 голосов
/ 15 декабря 2010

У вас может быть модель, от которой наследуются все модели:

public abstract class MasterModel
{
    public int NumberOfMessages { get; set; }
    public string Username { get; set; }
}

И тогда у вас может быть какая-то фабрика моделей, которая создаст запрошенную модель:

public class ModelFactory : IModelFactory
{

    private IUserRepository userRepository;

    public ModelFactory(IUserRepository userRepository)
    {
         // Inject a repository .. or a service...
         this.userRepository = userRepository;
    }

    public T Create<T>() where T : MasterModel, new()
    {
        var m = new T()
        {
            NumberOfMessages = this.userRepository.GetNumberMessages(currentUser) // Get current user somehow... HttpContext
        };
        return m;

    }
}

Итак, вы вставляете IModelFactory в свой контроллер и затем используете его внутри действия:

[HttpGet]
public ViewResult DoSomething()
{
    var model = this.modelFactory.Create<MyActionModel>();
    return View(model);
}

Тогда ваш мастер имеет MasterModel тип модели и затем может использовать эту информацию. Таким образом, вся ваша логика может храниться в сервисе / репозитории, который внедряется в фабрику, которая создает модель каждого представления. Это то, что я делаю, и это прекрасно работает.

2 голосов
/ 15 декабря 2010

Альтернативой ответу Дарина является ActionFilterAttribute, который вставляет данные в ViewData каждого действия.Где вы размещаете атрибут, определяет, какие действия получают это.Размещение его в корневом классе Controller означает, что все действия получат его.

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