如何在MVC中更改子操作的顺序

use*_*287 5 c# action razor asp.net-mvc-3

我想在子动作中生成HTML头部分; 而页面有许多其他子动作.html head部分依赖于其他操作来确定应包含哪些js/css文件.不同的子动作可以共享相同的js/css文件; 并且不同的页面具有不同的css/js组合,因此有理由这样做.这是我的示例代码:

Layout.cshtml:
<html>
<head>
@RenderZone("header")
</head>
<body>
@RenderZone("zone1")
@RenderZone("zone2")
@RenderZone("zone3")
</html>
Run Code Online (Sandbox Code Playgroud)

每个区域都有1个或多个子操作.

RenderZone也是一个动作.数据模式:

Model = GetAllChildActions(zoneName)
Run Code Online (Sandbox Code Playgroud)

RenderZone视图:

foreach(var m in Model)
    @html.action(controller = m.controller, action = m.action)
Run Code Online (Sandbox Code Playgroud)

因为Header区域是顶层所以它总是先执行,然后它无法从其他子操作中获取数据.我已经尝试过滤器(onActionExecuted; onActionResultExcuted等),但它们都不起作用.我真的需要在渲染所有子动作后执行头动作.我不想在页面底部生成css.我可以,但我不想使用javascript注入js/css文件; 或者写一个http模块来"手动"改变输出html.在webform中处理它非常容易.我相信在MVC中也有办法做到这一点.任何帮助将不胜感激!

Pau*_*yng 3

您可以预渲染所有子动作:

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

然后在正文中:

@prerender["header"]
Run Code Online (Sandbox Code Playgroud)

这样,您可以让所有子项在视图中渲染第一个区域之前执行其执行,并将脚本/CSS 注册存储在当前 HttpContext 中。