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中也有办法做到这一点.任何帮助将不胜感激!
您可以预渲染所有子动作:
@{
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 中。
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |