1

我有一个 MVC 视图,它由一个主视图和一些通过@Html.Action.

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

我的子操作的视图可以使用这个:

@section Scripts {
    //Add scripts
}

到目前为止,我还不能让它工作,所以如果它不工作,那将是一种替代方法吗?

4

2 回答 2

1

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

因此,在您_Layout.cshtml的某个位置,您将拥有:

@Html.RegisteredScripts()

然后在你的部分:

@{Html.RegisterScript("~/scripts/foo.js");}
于 2013-09-25T06:23:21.010 回答
1

我今天愿意创建一个在某些条件下会打开的全局对话框,我需要脚本位于页面底部。正如其他人已经提到的那样,子操作内的@section 是不可能的。

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

如果您喜欢, https ://stackoverflow.com/a/9663249/29407的解决方案是有效的,对我来说不,谢谢。

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

经过我的分析,我意识到我们有 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>

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

于 2017-08-15T13:26:26.653 回答