我通过Visual Studio 2012创建了一个新的ASP.NET Web窗体项目。不幸的是,默认的Site.Master文件非常混乱。 (我将这些问题一起发布,因为它们非常相关并且引用了相同的代码。)
首先,我已经理解了目的的捆绑和缩小,因此无需讨论。但是我不了解脚本被包含在默认母版页中的方式。
问题1:
为什么在BundleConfig.cs文件中创建了一个名为“〜/ bundles / WebFormsJs”的包,但在主页中,这些相同的单个.js文件中的每一个都在ScriptManager中逐一列出?
Inside 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"));
Inside 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中单独引用,为什么要创建该bundle?
问题2:
为什么要以这种方式使用ScriptManager?我的印象是,Microsoft的Ajax版本需要使用ScriptManager,例如使用UpdatePanels。这里使用ScriptManager的目的是什么......只是简单地注册javascript文件?
问题3:
通过ScriptManager注册javascript文件与使用以下方法的Site.Master顶部注册有什么区别?
<%: 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”?为什么我没有看到像BundleConfig.cs一样捆绑在一起的jQuery .js文件,就像所有其他捆绑包一样?
问题5:
如果我不打算使用UpdatePanel和那些类型的Microsoft Ajax控件,是否可以从Site.Master中删除以下脚本引用?我有点困惑,为什么默认情况下甚至包括它。
<asp:ScriptReference Name="MsAjaxBundle" />
答案 0 :(得分:16)
更新:这是一篇新博客文章,其中还讨论了更多内容:ASP.NET article
基本上webforms +捆绑看起来像这样,因为我们无法在scriptmanager中更改一堆遗留行为。
关于您的具体问题:
基本上这是正确的重复数据删除工作,脚本管理器对原始脚本资源有限制,阻止它们进行脚本映射,因此需要将它们映射到磁盘,然后由于文件已经被包含而被正确地重复删除在捆绑中。 WebformsBundleJs是在ScriptManager nupkgs内部的PreAppStart代码内创建的脚本映射。 (我同意这几乎不可能发现)
新的4.5功能,如不引人注目的验证需要jquery(通过scriptmanager),这就是使用脚本管理器来确保jquery不会被渲染两次的原因。
这样可以正常工作,但它永远不会使用ScriptManager进行重复数据删除。因此,对于现代化者而言,它不会成为一个问题。
jquery包将jquery文件放到Scripts文件夹中的磁盘上。
该引用引入包含所有ajax脚本的msajaxbundle,如果您不需要/想要它们,我认为可以安全删除。
答案 1 :(得分:0)
我或多或少都有同样的问题......
但是对于问题4,我有不同的意见。
WebFormsBundle和MsAjaxBundle都是在PreAppStatCode中定义的脚本引用(就像你找不到这个文件的位置)。
所以,我觉得默认情况下在同一个地方(ScriptManager.WebForms PreAppStartCode)有另一个jquery和jQueryUI脚本引用的定义。这些引用在脚本管理器中使用。
这个过程非常重要,因为这样你就可以利用一些重要的功能,比如CDN等。在PreAppStartCode中为这个特定的引用定义了jquery,有一个定义的CDN路径,用于以下情况:您在母版页的脚本管理器中激活EnableCDN(EnableCdn =“true”)
答案 2 :(得分:0)
只是为了澄清问题1的接受答案解释:
单个Web表单js文件的脚本引用的原因是允许本地文件(例如“〜/ Scripts / WebForms / WebForms.js”)覆盖System.Web中存在的相同文件。 dll(如果您反映System.Web.dll并查看references文件夹,您将找到相同的.js文件。)