我通过 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" />