我今天愿意创建一个在某些条件下会打开的全局对话框,我需要脚本位于页面底部。正如其他人已经提到的那样,子操作内的@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>
我希望这可以帮助任何人。