【问题标题】:Load a different jQuery library from Layout in View for DataTables in MVC为 MVC 中的 DataTables 从视图中的布局加载不同的 jQuery 库
【发布时间】:2016-12-14 08:19:34
【问题描述】:

我需要在我将使用 DataTables 库的视图中加载特定的 jQuery 库版本。

问题是我对所有项目都使用 jQuery 3.1,并且我在 _Layout 视图中包含了引用,但 DataTables 只允许:

Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3

如果可能,我如何在该特定视图中加载不同版本的 jQuery?

编辑:

关于 DavidG 的评论,似乎该消息是基于不支持 jQuery v3 的 Bootstrap jQuery 支持库。

我将更新到 Bootstrap 3.3.7 以避免这个问题(“添加对 jQuery 3 的支持”)并使用 jQuery 3.1.0,但 DataTables 问题仍然存在。

EDIT2(解决方案):

我决定按照 Shyju 的建议保持一切简单并基于一个稳定的 jQuery 版本,因此我将 jQuery 降级到 2.2.4(最后一个 v2 稳定版本),并将 Bootstrap 保留到最后一个版本(v3.3.7 )。

DataTables 版本保持不变 (1.10.12)。

【问题讨论】:

  • 对该视图使用不同的布局?
  • 您好,谢谢!但这违反了 DRY 原则 :( 我将不得不在两个视图中复制布局的每一次更改
  • 再想一想,如果你正在运行 Bootstrap v3,你怎么能使用 jQuery 3?您的整个项目肯定需要 v1 或 v2 吗?
  • 因为在 Bootstrap 网站上它说“所有插件都需要包含最新版本的 jQuery”。它链接到版本 3.1.0,所以我已将我的项目更新到最新的 3.1.0.version
  • 您的项目中有什么确切版本的 Bootstrap?

标签: javascript jquery asp.net-mvc datatable


【解决方案1】:

如果您绝对需要为特定页面加载不同版本的库,您可以这样做。

在返回有数据表的视图的具体action方法中,设置一个ViewBag

public ActionResult List()
{
    ViewBag.NeedsSpecialJQuery = true;
    return View();
}

在 Layout(_Layout.cshtml) 中,检查这个 viewbag 项并根据它的存在/值,有条件地加载您需要的 jQuery 版本。

@{
    if (ViewBag.NeedsSpecialJQuery != null && ViewBag.NeedsSpecialJQuery )
    {
        <script src="path to jQuery 1.9.1 here"></script>
    }
    else
    {
        <script src="path to other jQuery here"></script>
    }
}

虽然这可能会解决您当前的问题,但我强烈建议您考虑更新您的 jQuery 版本(以及其他依赖于 jQuery 的库),以便您只需要一个版本。这可能是一点工作。但这是值得的。你不需要寻找这样的解决方法

另一种选择是为特定视图使用单独的布局文件

【讨论】:

  • OP 必须降级 jQuery 才能使用单个库。
  • 我的建议是将 jQuery 和其他依赖于此的库更新为单个稳定版本,否则 OP 将来会遇到类似这样的孤立问题
  • 其实看问题,看不出来OP怎么用v3,和Bootstrap完全不兼容。
  • 我从未提及 v3 或 v4。我的建议是采用单一稳定版本以避免将来出现问题。
  • 我知道,但 OP 确实提到了,这意味着他必须至少降级到 v2,这一切都会消失。
【解决方案2】:

使用jQuery.noConflict() 可以实现此目的。

  • 加载旧的 jQuery 库。
  • 将其全局引用更改为$ 以外的其他内容。例如jQuery2
  • 加载新的 jQuery 库

您可以继续为新库使用$ 处理程序,并且可以调用您提供的名称,例如jQuery2,只要你想用旧的

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript" charset="utf8" src="//cdn.datatables.net/1.10.12/js/jquery.dataTables.js"></script>
<script type="text/javascript">
    var jQuery2 = $.noConflict(true);
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

如果您只想在特定页面中安装旧的 jQuery 库,您可以将此答案与Shyju's Solution 结合,您可以在他们的 ViewBag 中设置一个布尔值并像这样使用它。

@{
    if (ViewBag.NeedsSpecialJQuery != null && ViewBag.NeedsSpecialJQuery)
    {
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
        <script type="text/javascript" charset="utf8" src="//cdn.datatables.net/1.10.12/js/jquery.dataTables.js"></script>
        <script type="text/javascript">
            var jQuery2 = $.noConflict(true);
        </script>
    }

    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
}

那你可以拨打DataTablelike

jQuery2("#datatable").DataTable();

Working jsFiddle

【讨论】:

  • 这样做的影响是您现在在每个页面上都加倍了 jQuery 库。
  • OP 可能希望拥有 jQuery 3 而不管页面如何,所以他需要这个。如果在每个页面上加载两个 jQuery 库有问题,他可以在加载那个之前检查页面是否需要 jQuery 2.2.4。
  • @DavidG,我实现了Shyju's solution 仅在特定视图中加载旧 jQuery。
  • @Patrick,加载旧 jquery 后立即加载数据表。
  • 如果你加载旧的jquery库,然后加载DataTable,然后在jquery上调用noConflict,应该没问题。查看更新的代码。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多