【问题标题】:Using an @section inside a ChildAction to add additional scripts to a page在 ChildAction 中使用 @section 向页面添加其他脚本
【发布时间】:2013-09-25 05:54:16
【问题描述】:

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

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

我的 Child Action 的 View 可以使用这个吗:

@section Scripts {
    //Add scripts
}

到目前为止,我还不能让它工作,所以如果不能,那还有什么替代方法?

【问题讨论】:

  • 你能把你的代码结构贴出来

标签: asp.net-mvc razor


【解决方案1】:

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

所以在您的_Layout.cshtml 中,您将在某个位置拥有:

@Html.RegisteredScripts()

然后在你的部分:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多