VS2012 – Web表单 – 捆绑混乱
我通过Visual Studio 2012创build了一个新的ASP.NET Web Forms项目。不幸的是,默认的Site.Master文件非常混乱。 (我将这些问题放在一起,因为它们非常相关,并且引用相同的代码。)
首先,我已经明白捆绑和缩小的目的 ,所以不需要讨论。 不过,我不明白在默认母版页中包含脚本的方式。
问题1:
为什么在BundleConfig.cs文件中创build一个名为“〜/ 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之外创build的“WebFormsJs”包的引用。 为什么如果每个这样的JavaScript文件都要在ScriptManager中被单独引用,那么这个包就会被创build出来?
问题2:
为什么一个ScriptManager被这样使用呢? ScriptManager是Microsoft的Ajax版本所需的印象,例如使用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" />
…我至less可以从BundleConfig.cs中识别“MsAjaxBundle”,但jquery和jquery.ui.combined在哪里定义? 我做了一个search,并在packages.config中find了对它们的引用。
<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文件的位置的path。 他们只是在这里列出,并与.NET Framework的特定版本(我的情况是4.5)奇怪地相关联。 为什么一个JavaScript资源将与.NET Framework的一个版本相关联,这是超越我的。
无论如何,问题4是这样的:如何添加/使用ScriptManager中的资源“jquery”? 为什么我没有看到像所有其他包一样,将BundleConfig.cs中的jQuery .js文件捆绑在一起?
问题5:
如果我不打算使用UpdatePanel和那些types的Microsoft Ajax控件,我可以从Site.Master中删除以下脚本引用吗? 我有点困惑,为什么这甚至包括在这里默认情况下。
<asp:ScriptReference Name="MsAjaxBundle" />
更新:这是一个新的博客文章,也谈到了更多: ASP.NET文章
基本上webforms +捆绑看起来是这样的,因为我们无法在脚本pipe理器中更改一堆遗留行为。
关于你的具体问题:
-
基本上这是正确的重复数据删除工作,脚本pipe理器对原始脚本资源有一个限制,使它们不能被脚本映射,所以它们需要被映射到磁盘上,然后被正确地删除,因为这些文件已经包含在这个包中。 WebformsBundleJs是在ScriptManager nupkgs内的PreAppStart代码内部创build的脚本映射。 (我同意这几乎是不可能发现的)
-
新的4.5function,如不显眼的validation需要jQuery(通过scriptmanager),这就是为什么脚本经理被用来确保jQuery不会被呈现两次。
-
这将工作正常,但它不会用ScriptManager重复数据删除。 所以现代化不会是一个问题。
-
jquery包将jquery文件放到您的Scripts文件夹的磁盘中。
-
该引用在msajaxbundle包含所有的ajax脚本,如果你不需要/需要他们,我认为它的安全删除。
我也有或多或less相同的问题…
然而关于问题4,我有不同的意见。
WebFormsBundle和MsAjaxBundle都是在PreAppStatCode中定义的脚本引用(就像你我找不到这个文件在哪里)。
所以,我有这样的感觉,在同一个地方(ScriptManager.WebForms PreAppStartCode)默认情况下有jQuery和jQueryUI脚本引用的另一个定义。 脚本pipe理器使用这些引用。
这个过程是非常重要的,因为这样你就可以利用一些重要的function,比如CDN等。在PreAppStartCode的jQuery的定义中为这个特定的引用定义了一个CDNpath,当你激活在母版页的脚本pipe理器中启用CDN(EnableCdn =“true”)
只是为了澄清问题1的接受答案的解释:
对于单个Web窗体js文件的脚本引用的原因是允许本地文件(如“〜/ Scripts / WebForms / WebForms.js”)覆盖System.Web.dll中存在的相同文件(If你反映了System.Web.dll,并在参考文件夹中find相同的.js文件)。