2015-02-20 3 views
0

В основном у меня есть структура веб-страницы, где общие части страницы (заголовок, боковая панель и т. Д.) Генерируются в отдельном контроллере, заполненном дочерними действиями, выводящими частичные виды. Затем я вызываю эти действия (используя RenderAction()) со страницы макета веб-сайта.Постоянные данные по внутренним трубопроводам/запросам

Так что (если я прав, говоря это), существует несколько внутренних конвейеров mvc (внутренние запросы заголовка/боковой панели), включая исходный конвейер запросов для конкретной веб-страницы. Как/Где я могу инициализировать некоторые данные из исходного запроса на конвейер и получить эти данные из других внутренних запросов конвейера mvc?

Резюме того, что я хочу сделать (с примером)

  1. Запрос на вебсайте.
  2. MVC начинает трубопровод для «Home» контроллер «индекс» действия.
  3. Перед выполнением действия необходимо создать некоторые данные, которые впоследствии могут быть доступны.
  4. На странице макета, несколько методов «RenderAction» получить казнены создание суб трубопроводов для INTERAL запросов (например, контроллер «Shell», «DisplayHeaderBar» действие
  5. «DisplayHeaderBar» необходим доступ к некоторым данным, который был установлен в шаге 3 перед рендеринга частичный вид

Надеемся, что это имеет смысл ...

+0

Я бы хранить данные, созданные на шаге 3 в модели для «Home» Страница , затем передайте данные из модели в частичный вид. Подумайте о панели заголовка отображения в качестве подзаголовка, который уверенно отображает серверную сторону, но он отображается после основного конвейера. – theDarse

+0

Частичный вид не находится на странице «Главная». Частичные представления (для заголовка/боковой панели) отображаются in_Layout.cshtml. Для Exmaple, в макете .... @ {Html.RenderAction ("DisplayHeaderBar");} @RenderBody() – Josh

+0

Создайте viewModel для всей страницы.Когда вы вызываете RenderAction, передайте данные из основного видаModel в дочернее действие в @ Html.RenderAction. Затем в действии дочернего контроллера получите доступ к этим данным и уничтожьте их. – tranceporter

ответ

-2

Я думаю, вы могли бы использовать TempData для этого. Tempdate будет удален после того, как вы к нему доступ, так что если вы хотите использовать данные более чем один раз использовать TempData .Peek или Tempdata.Keep.

Вот ссылка с некоторым объяснением, как вы можете передавать данные в asp.net mvc.

https://msdn.microsoft.com/en-us/library/dd394711%28v=vs.100%29.aspx

Если TempData не делает, то вы можете использовать кэш.

+0

№ Полная остановка. Не используйте для этого 'TempData'. Период. –

+0

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

+0

@ theDarse Tempdata удаляется при чтении, но вы можете использовать keep and peek, чтобы прочитать его и все еще иметь его на потом. http://stackoverflow.com/questions/21252888/tempdata-keep-vs-peek. В любом случае, я думаю, что это может сработать, может быть, я плохо это понял. – okisinch

0

Что вы ищете - это действия ребенка. Вы просто создаете действие в каком-то контроллере, который возвращает частичное представление. Например, вы могли бы обрабатывать свой сайт навигации с помощью:

[ChildActionOnly] 
public ActionResult SiteNavigation() 
{ 
    // get the data for your nav 
    return PartialView("_SiteNavigation", yourSiteNavModel); 
} 

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

Затем создать представление в Views\Shared\_SiteNavigation.cshtml:

@model Namespace.To.ClassForSiteNavigation 

<!-- render your site navigation using the model --> 

Наконец, в макете:

@Html.Action("SiteNavigation", "ControllerWhereThisExists") 
Смежные вопросы