54

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

问题 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" />
4

3 回答 3

17

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

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

关于您的具体问题:

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

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

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

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

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

于 2012-09-06T21:23:49.983 回答
0

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

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

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

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

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

于 2013-06-06T10:21:53.300 回答
0

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

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

于 2015-12-15T18:40:57.963 回答