如何改变MVC中的子动作的顺序

本文关键字:顺序 MVC 何改变 改变 | 更新日期: 2023-09-27 18:10:40

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

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

每个区域有一个或多个子动作。

RenderZone实际上也是一个动作。数据模式:

Model = GetAllChildActions(zoneName)

RenderZone视图:

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

因为Header区域是顶部,所以它总是首先执行,然后它不能从其他子操作获取数据。我试过过滤器(onactionperformed;onActionResultExcuted等),但它们都不起作用。我确实需要在呈现所有子操作之后执行header操作。我不想在页面底部生成css。我可以,但我不想使用javascript注入的js/css文件;或者编写一个HTTP模块来"手动"更改输出html。在webform中处理它非常容易。我相信在MVC中也有办法做到这一点。任何帮助将非常感激!

如何改变MVC中的子动作的顺序

你可以预先呈现所有的子动作:

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

然后在正文中:

@prerender["header"]

这样,你可以让所有的子节点在渲染视图中的第一个区域之前执行它们的执行,并将脚本/css注册存储在当前的HttpContext中。