首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >VS2012 -网页表单-捆绑混淆

VS2012 -网页表单-捆绑混淆
EN

Stack Overflow用户
提问于 2012-09-06 06:13:28
回答 3查看 17.6K关注 0票数 54

我通过Visual Studio2012创建了一个新的ASP.NET Web Forms项目。不幸的是,默认的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会以这种方式使用?我的印象是微软的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" />

但我也不明白这是怎么回事。我以为NuGet用的是packages.config。另外..。我甚至没有看到这里列出的这些jQuery .js文件的位置的路径。它们只是在这里列出,并奇怪地与特定版本的.NET框架(在我的例子中是4.5)联系在一起。我不明白为什么javascript资源会与.NET框架的某个版本相关联。

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

问题5:

如果我不打算使用Site.Master和那些Microsoft Ajax控件,我可以从UpdatePanel中删除以下脚本引用吗?我有点困惑,为什么在默认情况下它会包含在这里。

<asp:ScriptReference Name="MsAjaxBundle" />
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-07 05:23:50

更新:这是一篇新的博客文章,也谈到了更多内容:ASP.NET article

基本上,webforms + bundling看起来像这样,这是由于我们无法在scriptmanager中更改的一堆遗留行为。

关于你的具体问题:

  1. 基本上就是这样重复数据消除才能正常工作,脚本管理器对原始脚本资源有一个限制,这阻止了它们被脚本映射,因此它们需要映射到磁盘,然后进行适当的重复数据消除,因为文件已经包含在捆绑包中。WebformsBundleJ是一个脚本映射,它是在ScriptManager nupkg内的PreAppStart代码中创建的。(我同意这几乎是不可能发现的)
  2. 新的4.5特性,比如需要jquery的非侵入性验证(通过脚本管理器),这就是为什么脚本管理器被用来确保jquery不会被渲染两次。
  3. 这将工作得很好,但它永远不会在ScriptManager中删除重复数据。因此,对于现代人来说,这不是问题。
  4. jquery包将jquery文件放到磁盘上的scripts文件夹中。
  5. 将包含所有ajax脚本的msajaxbundle拉入其中,如果你不需要/不想要它们,我认为删除它们是安全的。
票数 17
EN

Stack Overflow用户

发布于 2013-06-06 18:21:53

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

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

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

因此,我有一种感觉,默认情况下,在同一位置(ScriptManager.WebForms PreAppStartCode)有另一种定义用于jQueryUI脚本引用和jquery。这些引用在脚本管理器中使用。

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

票数 0
EN

Stack Overflow用户

发布于 2015-12-16 02:40:58

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12290537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档