我有一个 MVC 视图,它由一个主视图和一些通过@Html.Action
.
在附加内容(即 a ChildOnlyAction
)中,我希望能够向页面添加一些 JS,但我想将其添加到@RenderSection("Scripts")
我在布局中定义的块中。
我的子操作的视图可以使用这个:
@section Scripts {
//Add scripts
}
到目前为止,我还不能让它工作,所以如果它不工作,那将是一种替代方法吗?
我有一个 MVC 视图,它由一个主视图和一些通过@Html.Action
.
在附加内容(即 a ChildOnlyAction
)中,我希望能够向页面添加一些 JS,但我想将其添加到@RenderSection("Scripts")
我在布局中定义的块中。
我的子操作的视图可以使用这个:
@section Scripts {
//Add scripts
}
到目前为止,我还不能让它工作,所以如果它不工作,那将是一种替代方法吗?
部分在局部视图中不起作用。您可以使用我在此处说明的扩展方法的组合:https ://stackoverflow.com/a/9663249/29407
因此,在您_Layout.cshtml
的某个位置,您将拥有:
@Html.RegisteredScripts()
然后在你的部分:
@{Html.RegisterScript("~/scripts/foo.js");}
我今天愿意创建一个在某些条件下会打开的全局对话框,我需要脚本位于页面底部。正如其他人已经提到的那样,子操作内的@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>
我希望这可以帮助任何人。