VS2012 - Web表单 - 捆绑混乱

时间:2012-09-05 22:13:28

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

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

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

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

Inside 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"));

Inside 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”包的引用。如果这些javascript文件中的每一个都将在ScriptManager中单独引用,为什么要创建该bundle?

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

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

<%: 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”?为什么我没有看到像BundleConfig.cs一样捆绑在一起的jQuery .js文件,就像所有其他捆绑包一样?

问题5:
如果我不打算使用UpdatePanel和那些类型的Microsoft Ajax控件,是否可以从Site.Master中删除以下脚本引用?我有点困惑,为什么默认情况下甚至包括它。

<asp:ScriptReference Name="MsAjaxBundle" />

3 个答案:

答案 0 :(得分:16)

更新:这是一篇新博客文章,其中还讨论了更多内容:ASP.NET article

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

关于您的具体问题:

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

  2. 新的4.5功能,如不引人注目的验证需要jquery(通过scriptmanager),这就是使用脚本管理器来确保jquery不会被渲染两次的原因。

  3. 这样可以正常工作,但它永远不会使用ScriptManager进行重复数据删除。因此,对于现代化者而言,它不会成为一个问题。

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

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

答案 1 :(得分:0)

我或多或少都有同样的问题......

但是对于问题4,我有不同的意见。

WebFormsBundle和MsAjaxBundle都是在PreAppStatCode中定义的脚本引用(就像你找不到这个文件的位置)。

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

这个过程非常重要,因为这样你就可以利用一些重要的功能,比如CDN等。在PreAppStartCode中为这个特定的引用定义了jquery,有一个定义的CDN路径,用于以下情况:您在母版页的脚本管理器中激活EnableCDN(EnableCdn =“true”)

答案 2 :(得分:0)

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

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