【问题标题】:Bundles rendering order not same as in Include [duplicate]捆绑渲染顺序与包含 [重复] 中的不同
【发布时间】:2017-05-24 08:08:49
【问题描述】:

我的 ASP MVC 应用程序配置了以下捆绑包。

bundles.Add(new ScriptBundle("~/Scripts/Core").Include(
                "~/Content/th/assets/global/plugins/jquery.min.js", // Should be first
                "~/Content/th/assets/global/plugins/bootstrap/js/bootstrap.min.js",
                "~/Content/th/assets/global/plugins/js.cookie.min.js",
                "~/Content/th/assets/global/plugins/jquery-slimscroll/jquery.slimscroll.min.js",
                "~/Content/th/assets/global/plugins/jquery.blockui.min.js",
                "~/Content/th/assets/global/plugins/jquery-ui/jquery-ui.min.js", // Should be after jquery.min.js
                "~/Content/th/assets/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js",
                "~/Content/th/assets/global/plugins/bootstrap-select/js/bootstrap-select.min.js",
                "~/Content/th/assets/pages/scripts/components-bootstrap-select.js",
                "~/Content/th/assets/pages/scripts/portlet-draggable.min.js",
                "~/Content/th/assets/global/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js",
                "~/Content/th/assets/global/plugins/po/jquery.webui-popover.min.js",
                "~/Content/th/assets/pages/scripts/components-bootstrap-multiselect.min.js",
                "~/Content/th/assets/pages/scripts/components-date-time-pickers.js"

为什么会先输出jquery-ui.min.js?我怎样才能防止这种行为,因为它会产生 javascript 错误?

这是@Scripts.Render("~/Scripts/Core")的输出行

<script src="/Content/th/assets/global/plugins/jquery-ui/jquery-ui.min.js"></script>
<script src="/Content/th/assets/global/plugins/jquery.min.js"></script>
<script src="/Content/th/assets/global/plugins/bootstrap/js/bootstrap.min.js"></script>
<script src="/Content/th/assets/global/plugins/js.cookie.min.js"></script>
<script src="/Content/th/assets/global/plugins/jquery-slimscroll/jquery.slimscroll.min.js"></script>
<script src="/Content/th/assets/global/plugins/jquery.blockui.min.js"></script>
<script src="/Content/th/assets/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js"></script>
<script src="/Content/th/assets/global/plugins/bootstrap-select/js/bootstrap-select.min.js"></script>
<script src="/Content/th/assets/pages/scripts/components-bootstrap-select.js"></script>
<script src="/Content/th/assets/pages/scripts/portlet-draggable.min.js"></script>
<script src="/Content/th/assets/global/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js"></script>
<script src="/Content/th/assets/global/plugins/po/jquery.webui-popover.min.js"></script>
<script src="/Content/th/assets/pages/scripts/components-bootstrap-multiselect.min.js"></script>
<script src="/Content/th/assets/pages/scripts/components-date-time-pickers.js"></script>

【问题讨论】:

    标签: c# asp.net-mvc bundle


    【解决方案1】:

    对于 MVC5 版本,为了保持您期望的顺序,您可以使用下面的一个

    internal class AsIsBundleOrderer : IBundleOrderer
    {
        public virtual IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
        {
            return files;
        }
    }
    
    internal static class BundleExtensions
    {
        public static Bundle ForceOrdered(this Bundle sb)
        {
            sb.Orderer = new AsIsBundleOrderer();
            return sb;
        }
    }
    

    在捆绑时您提到.ForceOrdered() 方法以按照您指定的顺序显示它们。

    bundles.Add(new ScriptBundle("~/Scripts/Core").Include(
                    "~/Content/th/assets/global/plugins/jquery.min.js", // Should be first
                    "~/Content/th/assets/global/plugins/bootstrap/js/bootstrap.min.js",
                    "~/Content/th/assets/global/plugins/js.cookie.min.js",
                    "~/Content/th/assets/global/plugins/jquery-slimscroll/jquery.slimscroll.min.js",
                    "~/Content/th/assets/global/plugins/jquery.blockui.min.js",
                    "~/Content/th/assets/global/plugins/jquery-ui/jquery-ui.min.js", // Should be after jquery.min.js
                    "~/Content/th/assets/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js",
                    "~/Content/th/assets/global/plugins/bootstrap-select/js/bootstrap-select.min.js",
                    "~/Content/th/assets/pages/scripts/components-bootstrap-select.js",
                    "~/Content/th/assets/pages/scripts/portlet-draggable.min.js",
                    "~/Content/th/assets/global/plugins/bootstrap-multiselect/js/bootstrap-multiselect.js",
                    "~/Content/th/assets/global/plugins/po/jquery.webui-popover.min.js",
                    "~/Content/th/assets/pages/scripts/components-bootstrap-multiselect.min.js",
                    "~/Content/th/assets/pages/scripts/components-date-time-pickers.js")
    .ForceOrdered());
    

    【讨论】: