2009-03-31 2 views
6

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

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

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

Edit: Проблема Я смотрю на тот факт, что если поместить пользовательский элемент управления в моей MasterPage, опирающейся на ViewData, я должен Многократно включают, что ViewData для каждой отдельной страницы который использует указанную главную страницу. Возможно, решение в ссылке выше является лучшим решением, но я надеялся, что есть другие альтернативы.

ответ

1

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

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

4

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

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

    "%>
+1

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

0

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

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

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

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

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

+0

Вся причина, по которой я задаю этот вопрос, - посмотреть, есть ли альтернативы решению, указанному в ссылке в моем исходном вопросе. Но я предполагаю, что MS опубликует «лучшее» решение, которое они могут придумать. – codette

2

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

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

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

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

1

Я обычно использую абстрактный класс контроллера для моей 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); 
} 
+0

Чисто и просто, спасибо! Четыре года спустя и, наконец, получил надпись;) – statue

0

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

Смежные вопросы