Asp.net VS2012-Web表单-捆绑混淆

Asp.net VS2012-Web表单-捆绑混淆,asp.net,webforms,visual-studio-2012,asp.net-optimization,Asp.net,Webforms,Visual Studio 2012,Asp.net Optimization,我通过Visual Studio 2012创建了一个新的ASP.NET Web表单项目。不幸的是,默认的Site.Master文件非常混乱。(我将这些问题放在一起,因为它们非常相关,并且经常引用相同的代码。) 首先,我已经理解了捆绑和缩小的目的,因此无需讨论。但是,我不理解默认母版页中包含脚本的方式 问题1: 为什么在BundleConfig.cs文件中创建了一个名为“~/bundles/WebFormsJs”的捆绑包,而在母版页中,这些单独的.js文件却在ScriptManager中逐一列出

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

首先,我已经理解了捆绑和缩小的目的,因此无需讨论。但是,我不理解默认母版页中包含脚本的方式

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

在图C中:

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"));
网站内部。主:

<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”捆绑包的引用。如果这些javascript文件中的每一个都将在ScriptManager中单独引用,那么为什么会创建这个包呢

问题2:
为什么脚本管理器会以这种方式使用?我的印象是,微软版本的Ajax需要ScriptManager,比如使用UpdatePanels。在这里使用ScriptManager的目的是什么。。。只是为了注册javascript文件

问题3:
通过ScriptManager注册javascript文件与在Site.Master顶部注册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" />

更新:这是一篇新的博文,其中还讨论了以下内容:

基本上,webforms+捆绑看起来是这样的,这是因为我们无法在scriptmanager中更改一系列遗留行为

关于你的具体问题:

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

  • 新的4.5特性,如不引人注目的验证要求jquery(通过scriptmanager),这就是为什么使用scriptmanager来确保jquery不会被渲染两次

  • 这将很好地工作,但它永远不会使用ScriptManager进行重复数据消除。所以对于现代化者来说,这不是一个问题

  • jquery包将jquery文件放到脚本文件夹中的磁盘上

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


  • 我也有差不多相同的问题

    然而,关于问题4,我有不同的看法

    WebFormsBundle和MsAjaxBundle都是在PreAppStatCode中定义的脚本引用(与您一样,我找不到该文件的位置)

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


    这一过程非常重要,因为通过这种方式,您可以利用一些重要功能,如CDN等。在PreAppStartCode中为该特定引用定义jquery时,有一个定义的CDN路径,将在您在母版页的脚本管理器中激活EnableCDN时使用(EnableCDN=“true”)

    为了澄清问题1的接受答案解释:


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

    添加到问题3,使用jquery进行验证非常好,但它与我的站点中已有的jquery代码相冲突。我在这里也发布了相关信息:我不能在头部使用以下引用(以及附带的jquery代码),因为对jquery的scriptmanager引用与之重复:Wha