【问题标题】:What to do with Javascript files needed when rendering an asp.net MVC ChildAction如何处理呈现 asp.net MVC ChildAction 时所需的 Javascript 文件
【发布时间】:2014-03-06 23:33:34
【问题描述】:

我对 Child Action 进行了非常密集的调用,其中大量的 c# 代码在几个视图中被简单地调用:

@Html.RenderPartial("mychildAction")

现在,每当调用此操作时,我都需要加载一些 javascript 文件。我不能将标签内联(在视图内),因为 Jquery(和其他 JS 库)直到 html 页面结束才会加载。

(主)_layout 应该知道调用了此 ChildAction。但这并不是因为 Child Action 获得了新的 HttpContext。

我想出的唯一解决方案是切换到部分(包括一大块 c# 代码到部分中,并向保留在 HttpContext.Current.Items 中的一些自定义对象添加一些字符串,并使我的 _Layout 行为适当)。但是这样做意味着我在这个 ChildAction 上没有输出缓存,并且我会抛出一些不好的做法,比如部分代码。

处理这种情况的最佳方法是什么?

【问题讨论】:

  • 将 jquery 放入 <head> 标记中。我已经看到其他人说现代浏览器已经具备处理这个问题的能力,现在,将脚本放在文档末尾不再提高加载速度。

标签: c# javascript asp.net-mvc bundling-and-minification


【解决方案1】:

您可以使用

从调用操作中访问 HttpContext
Html.ViewContext.ParentActionViewContext

所以可以在“Items”集合中添加一些东西,这种方法可以解决这个特殊的问题,但我仍然想知道它是否是最好的方法。

【讨论】:

    【解决方案2】:

    视图负责渲染脚本,因为视图知道何时渲染局部视图,它知道何时为其渲染脚本。

    在您的布局中,您可能会发现:

    @RenderSection("scripts", required: false)
    

    视图可以像这样加载脚本:

    @section Scripts
    {
        @Scripts.Render("~/bundles/SomeBundle")
    }
    

    这允许调用视图呈现脚本。

    不可能是从局部视图或子视图呈现脚本。

    您可能会发现一些关于如何从局部视图呈现脚本的变通方法,但通常是视图负责知道要加载哪些脚本。

    编辑

    我见过的一些解决方法是here

    【讨论】:

    • 我认为您不能从 ChildAction 中渲染部分...(与您提到的部分视图相同)。问题仍然有效,如果您使用部分,_Layout 如何知道要加载脚本的脚本。
    • @dampee 视图将呈现脚本。就是这样。
    • 那么最佳实践是什么?您在标记有 ChildActionOnly 的方法中或在被调用的视图中放置了什么?
    • 您应该在视图中渲染脚本。请记住,您可以在那里创建捆绑包并加载孩子的东西。
    • 你有没有试过让它与 ChildActions 一起工作?我无法让它与捆绑和缩小一起使用。如果您添加对捆绑包的引用,则捆绑包将始终包含此 JS,即使在未引用 ChildAction 的页面上也是如此。你指的是哪个视图?在 @Html.Action 旁边还是在 ChildAction 的“部分”视图中?
    【解决方案3】:

    我同意@Odys

    _Layout.cshtml

    @RenderSection("scripts", required: false)
    

    子视图

    @{
        Layout = "~/Views/Share/_Layout.cshtml"
    }
    @section scripts
    {
        <script></script>
    }
    

    【讨论】:

    • 当您使用 Html.Action("method") 时,您不能使用部分!这就像尝试在 Partial 中使用部分一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多