【问题标题】:VS2012 - Web Forms - Bundling ConfusionVS2012 - Web 表单 - 捆绑混淆
【发布时间】:2012-08-30 17:02:27
【问题描述】:

我通过 Visual Studio 2012 创建了一个新的 ASP.NET Web 窗体项目。不幸的是,默认的 Site.Master 文件非常混乱。 (我将这些问题放在一起发布,因为它们非常相关并且引用了相同的代码。)

首先,我已经了解捆绑和缩小的目的,所以无需讨论。但是我确实了解脚本包含在默认母版页中的方式。

问题 1:
为什么在 BundleConfig.cs 文件中创建了一个名为“~/bundles/WebFormsJs”的包,而在母版页中,这些相同的单个 .js 文件中的每一个都在 ScriptManager 中一一列出?

BundleConfig.cs 内部:

bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
              "~/Scripts/WebForms/WebForms.js",
              "~/Scripts/WebForms/WebUIValidation.js",
              "~/Scripts/WebForms/MenuStandards.js",
              "~/Scripts/WebForms/Focus.js",
              "~/Scripts/WebForms/GridView.js",
              "~/Scripts/WebForms/DetailsView.js",
              "~/Scripts/WebForms/TreeView.js",
              "~/Scripts/WebForms/WebParts.js"));

Site.Master 内部:

<body>
<form runat="server">
<asp:ScriptManager runat="server">
    <Scripts>
        <%--Framework Scripts--%>
        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="jquery.ui.combined" />
        <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
        <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
        <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
        <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
        <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
        <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
        <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
        <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
        <asp:ScriptReference Name="WebFormsBundle" />
        <%--Site Scripts--%>

    </Scripts>
</asp:ScriptManager>

如您所见......每个相同的 .js 文件都在 ScriptManager 中单独列出。我什至没有看到对在 BundleConfig.cs 之外的任何地方创建的“WebFormsJs”包的引用。如果要在 ScriptManager 中单独引用这些 javascript 文件中的每一个,为什么还要创建该捆绑包?

问题 2:
为什么要以这种方式使用 ScriptManager?我的印象是 Microsoft 的 Ajax 版本需要 ScriptManager,例如使用 UpdatePanels。在这里使用 ScriptManager 的目的是什么……只是为了简单地注册 javascript 文件?

问题 3:
通过 ScriptManager 注册 javascript 文件与在 Site.Master 顶部使用以下方法注册 javascript 文件有什么区别?

<%: Scripts.Render("~/bundles/modernizr") %>

问题 4:
在 ScriptManager 中,我还注意到了这些:

        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="jquery.ui.combined" />

...我至少可以从 BundleConfig.cs 中识别“MsAjaxBundle”,但是 jquery 和 jquery.ui.combined 定义在哪里?我进行了搜索,并在 packages.config 中找到了对它们的引用。

<package id="jQuery" version="1.7.1.1" targetFramework="net45" />
<package id="jQuery.UI.Combined" version="1.8.20.1" targetFramework="net45" />

但我也不明白这里发生了什么。我认为 packages.config 用于 NuGet。另外...我什至没有看到此处列出的这些 jQuery .js 文件位置的路径。它们只是在这里列出,并且奇怪地与特定版本的 .NET Framework(在我的例子中为 4.5)相关联。为什么 javascript 资源会与 .NET Framework 的某个版本相关联,这超出了我的理解。

无论如何,问题 4 是这样的:ScriptManager 中的资源“jquery”是如何添加/使用的?为什么我没有看到 jQuery .js 文件像所有其他包一样在 BundleConfig.cs 中捆绑在一起??

问题 5:
如果我不打算使用 UpdatePanel 和那些 Microsoft Ajax 控件,是否可以从 Site.Master 中删除以下脚本引用?我对为什么默认情况下甚至将其包含在此处感到有些困惑。

<asp:ScriptReference Name="MsAjaxBundle" />

【问题讨论】:

    标签: asp.net webforms visual-studio-2012 asp.net-optimization


    【解决方案1】:

    更新:这是一篇新的博文,其中也对此进行了更多讨论:ASP.NET article

    由于我们无法在 scriptmanager 中更改的一系列遗留行为,基本上网络表单 + 捆绑看起来像这样。

    关于您的具体问题:

    1. 基本上这样重复数据删除工作正常,脚本管理器对原始脚本资源有限制,这会阻止它们被脚本映射,因此需要将它们映射到磁盘,然后才能正确重复数据删除,因为文件已经包含在内在捆绑包中。 WebformsBundleJs 是在 ScriptManager nupkgs 内的 PreAppStart 代码内创建的脚本映射。 (我同意这几乎是不可能发现的)

    2. 新的 4.5 功能,如不显眼的验证需要 jquery(通过 scriptmanager),这就是为什么使用脚本管理器来确保 jquery 不会被渲染两次。

    3. 这可以正常工作,但它永远不会使用 ScriptManager 进行重复数据删除。所以对于modernizr来说这不是问题。

    4. jquery 包将 jquery 文件放到磁盘的 Scripts 文件夹中。

    5. 该引用引入了包含所有 ajax 脚本的 msajaxbundle,如果您不需要/不想要它们,我认为删除它们是安全的。

    【讨论】:

    • 补充到问题 3,使用 jquery 进行验证很棒,但它与我网站中已有的 jquery 代码冲突。我还在这里发布了这个:stackoverflow.com/questions/12065228/…> 我不能在头部使用以下引用(以及随附的 jquery 代码),因为脚本管理器对 jquery 的引用正在复制它: 在这种情况下微软推荐什么?我是否需要将我的 jquery 代码从头部移到 Web 表单中?
    • 对于问题 1,为什么 ~/bundles/WebFormsJs 从未在 Web 项目的其他任何地方引用(在 BundleConfig.cs 中创建定义之外)?似乎已定义此捆绑包,但在我对整个解决方案进行“在文件中查找”搜索时未在任何地方引用。
    • 它通过 ScriptMapping 在 WebForms ScriptManager preapp 启动代码中完成: ScriptManager.ScriptResourceMapping.AddDefinition("WebFormsBundle", new ScriptResourceDefinition { Path = "~/bundles/WebFormsJs" });
    • 其他人觉得这很可笑吗?
    • 答案中的链接已失效
    【解决方案2】:

    我也有或多或少相同的问题......

    但是关于问题 4,我有不同的看法。

    WebFormsBundle 和 MsAjaxBundle 都是在 PreAppStatCode 中定义的脚本引用(就像你一样,我找不到这个文件在哪里)。

    所以,我感觉在同一个地方 (ScriptManager.WebForms PreAppStartCode) 默认情况下,jquery 和 jQueryUI 脚本引用还有另一个定义。这些引用在脚本管理器中使用。

    这个过程非常重要,因为通过这种方式,您可以利用一些重要功能,例如 CDN 等。在 PreAppStartCode 中针对此特定参考的 jquery 定义中,有一个定义的 CDN 路径,以防万一您在母版页的脚本管理器中激活 EnableCDN (EnableCdn="true")

    【讨论】:

      【解决方案3】:

      只是为了从问题 1 的接受答案解释中澄清一些事情:

      脚本引用单个 Web 表单 js 文件的原因是允许本地文件(例如“~/Scripts/WebForms/WebForms.js”)覆盖 System.Web 中存在的相同文件。 dll(如果您反映 System.Web.dll 并查看引用文件夹,您会发现相同的 .js 文件)。

      【讨论】:

        猜你喜欢
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多