在ChildAction中使用@section向页面添加其他脚本

时间:2013-09-25 05:54:16

标签: asp.net-mvc razor

我有一个MVC视图,它由一个主视图和一些通过@Html.Action添加的其他内容组成。

在附加内容(ChildOnlyAction)中,我希望能够在页面中添加一些JS,但我想将其添加到我已定义的@RenderSection("Scripts")块中布局。

我的孩子行动的观点可以使用这个:

@section Scripts {
    //Add scripts
}

到目前为止,我还没有能够让它发挥作用,所以如果它不是一种替代方法呢?

2 个答案:

答案 0 :(得分:1)

我今天愿意创建一个在某些条件下打开的全局对话框,我需要将脚本放在页面底部。正如其他人已经提到的那样,儿童行动中的@section是不可能的。

我遇到了和你一样的问题,使用自定义帮助器和js文件的解决方案应该可行,但我不喜欢,因为通常我用razor操作javascript并且文件会使请求更长时间加载。

https://stackoverflow.com/a/9663249/29407的解决方案如果您愿意,则有效,对我而言,谢谢。

我带来了一个干净的新解决方案,如果你分析它的问题是我们有一个控制器和一个必须在最终结果的不同位置注入2个部分的视图。

在我的分析后,我意识到我们有2个视图,但是一个控制器必须按照每个请求控制它们一次,下面就是我如何做到的,我将javascript移动到一个带有脚本同名endig的新视图。

XDialogController.cs
XDialog.cshtml
XDialogScript.cshtml

然后在从子操作方法返回ActionResult之前,在TempData对象中设置另一个视图的模型。

例如:

[ChildActionOnly]
public ActionResult Popup()
{
// pass variable or model if you need it to script view.
TempData[TempDataKeys.ScriptXDialogModel] = new ModelScriptX();

// pass variable or model to regular view.
return PartialView("XDialog", new ModelX());
}

在您的... Script.cshtml文件中,您可以根据需要阅读变量或模型。

例如:

@if((TempData[TempDataKeys.DisplayXDialog] as bool?) == true)
{
    <script type="text/javascript">
      ...jquery functions ....
    </script>
}

请记住,TempData只能读取一次,可以将值保留在视图内的变量中。

要在布局页面中调用我的对话框,请执行以下操作:

<body>

@RenderBody()

@Html.Action("Popup", "XDialog")

@Scripts.Render("~/Scripts/core")
@RenderSection("ExtraScripts", required: false)

@Html.Partial("XDialogScript")

</body>

我希望这可以帮助任何人。

答案 1 :(得分:0)

部分在部分视图中不起作用。您可以使用我在此处说明的扩展方法的组合:https://stackoverflow.com/a/9663249/29407

所以,在你的_Layout.cshtml,你会在某个地方:

@Html.RegisteredScripts()

然后在你的部分:

@{Html.RegisterScript("~/scripts/foo.js");}