передача viewdata на asp.net mvc masterpages - PullRequest
6 голосов
/ 31 марта 2009

Я пытаюсь передать ViewData моей главной странице asp.net mvc для пользовательского контроля mvc, который я храню на главной странице. Например, я создал выпадающий список имен как пользовательский контроль mvc и поместил его на своей главной странице.

Проблема, с которой я сталкиваюсь, заключается в передаче ViewData на главную страницу. Я нашел эту статью от Microsoft, в которой есть достойное решение, но мне было интересно, есть ли другие "лучшие" решения там. Что мне не нравится в решении по ссылке, так это то, что мне приходится менять каждый контроллер для наследования от нового класса контроллеров.

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

Редактировать : проблема, на которую я обращаю внимание, заключается в том, что если я размещаю пользовательский элемент управления на своей главной странице, основанной на ViewData, мне необходимо REPEATEDLY включить эти ViewData для каждого одна страница, которая использует указанную мастер-страницу. Возможно, решение по ссылке выше - лучшее решение, но я надеялся, что были и другие альтернативы.

Ответы [ 6 ]

4 голосов
/ 31 марта 2009

Главная страница уже имеет доступ к ViewData. Если вы хотите строго типизированный доступ к нему, вам нужно сделать две вещи:

  1. Поместите материал главной страницы в базовый класс (например, CommonViewData)
  2. Есть ли у вас наследие главной страницы от общего класса ViewMasterPage <>:

    "%>
2 голосов
/ 09 июня 2009

Не могли бы вы использовать метод OnActionExecuting в базовом классе контроллера и заполнить там данные представления?

Что-то вроде:

protected override void OnActionExecuting(ActionExecutingContext context)
{
  context.Controller.ViewData.Model = GetDataForControl();
}

Я не пробовал, так что это просто мысль ...

1 голос
/ 20 октября 2009

Я обычно использую класс абстрактного контроллера для моей MasterPage, это лучшее решение, потому что MasterPage похож на «абстрактный вид». Но я перезаписываю метод MasgerPageController View (), чтобы включить в него viewdata.

protected override ViewResult View(string viewName, string masterName, object model)
{
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages();
    return base.View(viewName, masterName, model);
}
1 голос
/ 01 апреля 2009

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

Что вы также можете сделать, если это данные, которые являются несколько статичными (например, меню, которое не сильно меняется), это поместить объект в кэш, чтобы ваша база данных не вызывалась для каждой инициализации контроллера. 1003 *

0 голосов
/ 14 февраля 2010

Я думаю, что предложенное решение работает, но не идеальное решение. Если мы поместим код в конструктор BaseController, он будет вызываться даже для методов Action, у которых нет MasterPages (например, методы Post и Ajax).
Я думаю, что лучшим решением (не идеальным) является вызов метода Html.Action на главной странице.

0 голосов
/ 01 апреля 2009

Я не совсем понимаю вашу проблему ...

Проблема, на которую я обращаю внимание, заключается в том, что если я размещу пользовательский элемент управления на моей главной странице, которая опирается на ViewData, мне придется ПОВТОРНО включать эти ViewData для каждой отдельной страницы, которая использует указанную главную страницу.

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

Вы не должны повторяться, если вы просто наследуете от базового контроллера.

Является ли ваша проблема тем, что некоторые контроллеры имеют действия, которые выполняют и не вызывают представления, производные от этой конкретной главной страницы? Таким образом, поэтому, если вы реализуете базовый контроллер, действия, которые не используют эту конкретную мастер-страницу, все равно будут иметь данные для просмотра ...? (Если все это имеет смысл; -)

...