Как изменить последовательность дочерних действий в MVC - PullRequest
5 голосов
/ 08 октября 2011

Я хочу создать заголовок HTML в дочернем действии; в то время как страница имеет много других дочерних действий. Раздел заголовка html зависит от других действий, чтобы определить, какие файлы js / css следует включить. Различные дочерние действия могут использовать один и тот же файл js / css; и разные страницы имеют разные комбинации css / js, поэтому есть причина для этого. Вот мой пример кода:

Layout.cshtml:
<html>
<head>
@RenderZone("header")
</head>
<body>
@RenderZone("zone1")
@RenderZone("zone2")
@RenderZone("zone3")
</html>

Каждая зона имеет 1 или несколько дочерних действий.

RenderZone - это тоже действие. Режим данных:

Model = GetAllChildActions(zoneName)

Вид RenderZone:

foreach(var m in Model)
    @html.action(controller = m.controller, action = m.action)

Поскольку зона заголовка является верхней, поэтому она всегда выполняется первой, тогда она не может получить данные от других дочерних действий. Я пробовал фильтры (onActionExecuted; onActionResultExcuted и т. Д.), Но ни один из них не работает. Мне действительно нужно выполнить действие заголовка после того, как все дочерние действия отображаются. Я не хочу генерировать CSS внизу страницы. Я мог бы, но я не хочу использовать javascript для внедрения файлов js / css; или напишите модуль http, чтобы «вручную» изменить вывод html. Это очень легко обрабатывать в веб-форме. Я считаю, что есть способ сделать это и в MVC. Любая помощь будет принята с благодарностью!

1 Ответ

3 голосов
/ 11 октября 2011

Вы можете предварительно отрендерить все дочерние действия:

@{
    var prerender = new Dictionary<string, MvcHtmlString>();
    prerender["header"] = RenderZone("header");
    prerender["zone1"] = RenderZone("zone1");
}

А потом в теле:

@prerender["header"]

Таким образом, вы можете сделать так, чтобы все дети выполняли свое выполнение до рендеринга первой зоны в вашем представлении, и сохраняли регистрации script / css в текущем HttpContext.

...