【问题标题】:How to change the sequences of child actions in MVC如何更改 MVC 中子动作的顺序
【发布时间】:2011-11-08 08:24:20
【问题描述】:

我想在子动作中生成 HTML 头部;而页面有许多其他子操作。 html head 部分取决于其他操作来确定应包含哪些 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)

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

【问题讨论】:

  • 简单的OrderBy()不可能吗?
  • 感谢您的回答!但是页面中的操作(子操作)没有可用的排序。与我们可以通过查找控件 ID 来加载用户控件的 Webform 不同,MVC razor 不提供检查页面子级的方法。

标签: c# asp.net-mvc-3 razor action


【解决方案1】:

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

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

然后在正文中:

@prerender["header"]

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

【讨论】:

  • 是的,预渲染先生有效!我不敢相信这是一个如此简单的解决方案!它实际上还有另一个好处,我可以通过循环数据库中的区域名称来呈现操作。现在我可以根据我的设置完全控制区域渲染的顺序了!!顺便说一下,数据不能放在父母的 viewbag/data 中。我不知道为什么。在基本控制器中,我添加了一个测试方法来通过覆盖 OnAction/Result Executing/ed 来放置数据,但没有奏效。我将数据放在 HttpContext.Items 中,效果很好。再次感谢您,非常感谢!并感谢您 Seen 打开赏金!
  • 很高兴了解 Parent ViewBag,我怀疑但认为它可能是可能的。 HttpContext 也一样好,很好的调用。
  • 我修改了答案以删除对 ParentActionContext ViewBag 的引用并说要使用 HttpContext
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多