<asp:Asp.Net 网络表单中的 ScriptManager,它是如何工作的?
<asp:ScriptManager in Asp.Net webforms, how it works?
我想弄清楚这是如何工作的。在 VS 模板(Web 窗体)的网站管理员中,我阅读了以下内容:
<asp:ScriptManager runat="server">
<Scripts>
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="bootstrap" />
<asp:ScriptReference Name="respond" />
<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>
现在一些脚本只有名称,其他脚本有名称和路径 + 程序集。
应用程序如何找出那些只有名称的路径以及为什么与其他路径存在差异。另外组装需要做什么?
如果您在解决方案资源管理器中展开 Web 项目的引用节点,或者打开“管理 NuGet 包”选项卡并使用 "AspNet.ScriptManager." 筛选已安装的包,您将看到诸如 AspNet.ScriptManager.jQuery
之类的引用和 Microsoft.AspNet.ScriptManager.MSAjax
。这些包附带默认的 VS 模板,它们的工作是添加应用程序的 ScriptMappings in the PreApplicationStart 方法。例如,AspNet.ScriptManager.jQuery
包的描述如下:
This package contains the AspNet.ScriptManager.jQuery assembly that
will automatically register jQuery x.y.z with the ScriptManager as
"jquery".
因此,这些是 ScriptManager 使用的名称。
下面是这些包添加的 ScriptMapping 定义的示例:
string str = "x.y.z";
ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
{
Path = "~/Scripts/jquery-" + str + ".min.js",
DebugPath = "~/Scripts/jquery-" + str + ".js",
CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + str + ".min.js",
CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + str + ".js",
CdnSupportsSecureConnection = true,
LoadSuccessExpression = "window.jQuery"
});
在 ASP.NET 4.5 中,Microsoft Ajax 脚本文件(MicrosoftAjaxCore 等)和 WebForms 脚本(GridView.js 等)已解耦,因此可以提供它们从您的应用程序脚本文件夹而不是从 System.Web
加载。存在 Assembly 和 Path 属性的原因是因为 ScriptManager 在尝试加载这些脚本时会对其进行特殊处理,因此必须对 ScriptManager 代码进行特殊安排才能使其正常工作。基本上,当 ScriptManager 尝试加载这些脚本时,它可以从 System.Web 或路径属性加载它们,最终在这种情况下,ScriptManager 会删除脚本引用的重复数据并从路径属性提供脚本。
我想弄清楚这是如何工作的。在 VS 模板(Web 窗体)的网站管理员中,我阅读了以下内容:
<asp:ScriptManager runat="server">
<Scripts>
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="bootstrap" />
<asp:ScriptReference Name="respond" />
<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>
现在一些脚本只有名称,其他脚本有名称和路径 + 程序集。 应用程序如何找出那些只有名称的路径以及为什么与其他路径存在差异。另外组装需要做什么?
如果您在解决方案资源管理器中展开 Web 项目的引用节点,或者打开“管理 NuGet 包”选项卡并使用 "AspNet.ScriptManager." 筛选已安装的包,您将看到诸如 AspNet.ScriptManager.jQuery
之类的引用和 Microsoft.AspNet.ScriptManager.MSAjax
。这些包附带默认的 VS 模板,它们的工作是添加应用程序的 ScriptMappings in the PreApplicationStart 方法。例如,AspNet.ScriptManager.jQuery
包的描述如下:
This package contains the AspNet.ScriptManager.jQuery assembly that will automatically register jQuery x.y.z with the ScriptManager as "jquery".
因此,这些是 ScriptManager 使用的名称。
下面是这些包添加的 ScriptMapping 定义的示例:
string str = "x.y.z";
ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
{
Path = "~/Scripts/jquery-" + str + ".min.js",
DebugPath = "~/Scripts/jquery-" + str + ".js",
CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + str + ".min.js",
CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + str + ".js",
CdnSupportsSecureConnection = true,
LoadSuccessExpression = "window.jQuery"
});
在 ASP.NET 4.5 中,Microsoft Ajax 脚本文件(MicrosoftAjaxCore 等)和 WebForms 脚本(GridView.js 等)已解耦,因此可以提供它们从您的应用程序脚本文件夹而不是从 System.Web
加载。存在 Assembly 和 Path 属性的原因是因为 ScriptManager 在尝试加载这些脚本时会对其进行特殊处理,因此必须对 ScriptManager 代码进行特殊安排才能使其正常工作。基本上,当 ScriptManager 尝试加载这些脚本时,它可以从 System.Web 或路径属性加载它们,最终在这种情况下,ScriptManager 会删除脚本引用的重复数据并从路径属性提供脚本。