【问题标题】:ASP.NET MVC 3 Razor Partial View - jQuery Included In Main LayoutASP.NET MVC 3 Razor 部分视图 - 主布局中包含的 jQuery
【发布时间】:2011-09-26 19:30:57
【问题描述】:

我正在使用的部分视图需要包含某些 jQuery 库,我目前正在尝试考虑最好的方法来很好地添加它们。

我目前的设置如下:

_Layout.cshtml:

...
@if (ViewBag.jQuery)
{
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"
            type="text/javascript"></script>
}
...

Index.cshtml:

...
@{ Html.RenderPartial("PartialView", 
       new MVCModel.Models.MyModel(), 
       new ViewDataDictionary { { "ViewBag", ViewBag } }); }
...

PartialView.cshtml:

...
@{
    if (ViewBag.ViewBag != null)
    {
        var vb = (dynamic)ViewBag.ViewBag;
        vb.jQuery = true;
    }
}
...

所以我要做的是在局部视图中“打开”库,并让该布尔值传播到主布局。这使得我可以在任何我想要的地方(许多部分视图,或一个视图多次使用)尽可能多地启用该库,但它只会被包含一次。最重要的是,我可以控制包含的顺序,因此我可以确保首先包含文件依赖项。

我只是想知道是否有更好的方法来解决这个问题。

现在我最大的两个问题是:

  1. ViewBag 不是强类型的,因此智能感知不会告诉我哪些库可供我使用。
  2. 将 ViewBag 传递给局部视图,以便我可以重复使用它。

【问题讨论】:

    标签: asp.net-mvc razor partial-views javascript


    【解决方案1】:

    这是实现目标的简单方法。

    MVC Razor 视图中有一个名为 RenderSection 的函数。它的语法类似于

    @RenderSection ("occasionalScripts", false)
    

    (occasionalScripts 是部分的名称,false 表示该部分是可选的,可能不会出现在每个页面中。)

    您可能希望将其包含在您的_Layout.cshtml 中,即Views\Shared。如果您为特定视图定义了脚本定义,这将允许您的主脚本模板显示包含脚本定义的部分。

    一般情况下,您希望将其放在页面底部,紧邻关闭 &lt;/body&gt; 标记之前。 (这是提高性能的最佳实践。)我将在其上方列出我所有的其他脚本(在每个页面上加载的脚本)。原因是因为jQuery脚本的加载顺序很重要。

    在您有特殊脚本的每个视图中,添加以下内容:

    @section occasionalScripts {
    ... put script references here
    }
    

    如果您有一个不需要特殊脚本的视图,那么您不需要在其中包含此部分。 @RenderSection 标记上的false 将容纳缺少@section 标记的任何视图。

    在实现此功能的每个页面上,您可以选择不同的脚本。

    或者,您可以为不同类别的文件定义多个部分。

    【讨论】:

      【解决方案2】:

      我通常有不同的方法,并认为网站上使用的所有库都应该在每个页面上引用。它确实使第一次加载有点慢,但随后所有页面的加载速度更快,因为它使用了浏览器缓存。

      为了更好地改进它,您可以使所有库仅在一个文件中可用。

      我在某个时候使用了SquishIt。我在 ASP.NET MVC 中集成得相当好。

      【讨论】:

      • 如果只在几页上需要这些库,那么在每一页上引用所有库并不是一个好主意。这会不必要地浪费带宽并使页面复杂化。
      • 我不同意。我认为压缩所有引用并让客户端浏览器下载一次(每个库只有一个请求而不是 1 个请求)并依赖浏览器的缓存不会浪费带宽。而且我没有看到它如何使页面复杂化......在每个页面上以不同方式加载它确实使维护复杂化......
      • 这取决于您下载的文件数量以及您是否真的需要每个页面上的所有这些文件。很多时候我会有 20 多个 Javsascript 文件用于不同的页面。绝对没有理由在每个页面上都包含所有这些 - 特别是如果用户不太可能访问需要某些文件的页面。此外,当您使用大量 jQuery 时,您确实面临着碰撞和其他问题的风险。而且......没有什么可以阻止您所有文件的缩小。此外,可以同时加载多个缩小文件。
      猜你喜欢
      • 1970-01-01
      • 2014-09-27
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多