我通过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" />
发布于 2012-09-07 05:23:50
更新:这是一篇新的博客文章,也谈到了更多内容:ASP.NET article
基本上,webforms + bundling看起来像这样,这是由于我们无法在scriptmanager中更改的一堆遗留行为。
关于你的具体问题:
发布于 2013-06-06 18:21:53
我也有或多或少相同的问题。
然而,对于问题4,我有不同的看法。
WebFormsBundle和MsAjaxBundle都是在PreAppStatCode中定义的脚本引用(和您一样,我也找不到这个文件的位置)。
因此,我有一种感觉,默认情况下,在同一位置(ScriptManager.WebForms PreAppStartCode)有另一种定义用于jQueryUI脚本引用和jquery。这些引用在脚本管理器中使用。
这个过程非常重要,因为通过这种方式,您可以利用一些重要的特性,如CDN等。在这个特定引用的PreAppStartCode中的jquery定义中,有一个已定义的CDN路径,当您在母版页的脚本管理器中激活EnableCDN (EnableCdn="true")时,将使用该路径。
发布于 2015-12-16 02:40:58
只是为了澄清问题1的接受答案解释中的一些事情:
单个web forms js文件的脚本引用的原因是允许本地文件(例如"~/Scripts/WebForms/WebForms.js")覆盖System.Web.dll中存在的相同文件(如果您反映System.Web.dll并查看references文件夹,您将发现相同的.js文件)。
https://stackoverflow.com/questions/12290537
复制相似问题