有人可以向我解释ScriptManager和ClientScript之间的区别吗?
当我在Button_Clicked事件中使用它时,ClientScript运行良好,但是当我在GridView的GridView_RowUpdated中使用它时,它不起作用。 (GirdView包含在更新面板中)。然后我尝试了ClientScript,在这种情况下它运行得很好。
答案 0 :(得分:12)
您已经确定了主要区别。 ScriptManager旨在与异步回发一起使用,这就是它与UpdatePanel一起使用的原因。 ClientScript类用于同步回发。因此,如果您要从UpdatePanel回发,请务必使用ScriptManager而不是ClientScript。
答案 1 :(得分:0)
问这个问题 9 年后,我发现自己在做一些软件考古,我正在写我自己关于 ASP.NET 习语的笔记,因此这个答案,我希望实际上回答了这个问题,因为我觉得 ShellyFM 的回答是不正确的,因为这句话:“ClientScript class is for synchronous postbacks”是不正确的)
ClientScriptManager
Page.ClientScript
property 公开了一个 ClientScriptManager
实例。
Page
实例都有自己的 ClientScriptManager
实例。ClientScriptManager
存储 <script>
元素的列表。这些 <script>
元素会自动呈现在 <asp:form runat="server">
元素中,紧跟在 <div class="aspNetHidden">
中呈现 ViewState 控件的位置之后。这些 <script>
元素可以使用不同的方法注册:
RegisterClientScriptBlock
RegisterClientScriptInclude
RegisterClientScriptResource
RegisterClientScriptBlock
直接向页面添加内联脚本。
// Page code:
this.ClientScript.RegisterClientScriptBlock( type: typeof(TestPage), key: " Script1", script: "function foo(){}", addScriptTags: true );
// *.aspx code:
<form id="form1" runat="server">
</form>
// Rendered result:
<form method="post" action="./TestPage.aspx" id="form1">
<div class="aspNetHidden"><!-- ViewState is rendered here --></div>
<script type="text/javascript">function foo(){}</script>
</form>
RegisterClientScriptInclude
将添加一个没有任何内联脚本的 <script src=""></script>
元素:
RegisterClientScriptResource
将添加一个 <script>
,它从 .NET 程序集的 <EmbeddedResource>
的 GetManifestResourceStream
中获取其内容。使用 src="/WebResource.axd?d=..."
引用脚本而不是内联呈现。
/WebResource.axd
文件。这是 ASP.NET 默认自行处理的保留 URL 模式。Page.BeginFormRender
方法直接调用 ClientScriptManager.RenderClientScriptBlocks()
并将 HtmlTextWriter
传递给它,因此 ClientScriptManager
不是 WebControl。有点令人惊讶的是,ClientScriptManager
不提供删除或取消注册脚本的方法 - 您也不能枚举现有的注册:you can only replace an existing registration - 并且仅如果您知道最初用于注册它的 String key
。
ScriptManager
ASP.NET AJAX 中添加了 ScriptManager
类,它是 2007 年发布的 ASP.NET 2.0 的扩展。
System.Web.Extensions.dll
(在 ASP.NET 2.0 和 4.0 中),而 ClientScriptManager
位于 System.Web.dll
,这表明它比 {{ 1}}。ScriptManager
本身是一个 WebControl(它派生自 ScriptManager
),因此它负责通过其 System.Web.UI.Control
方法直接呈现 HTML,而 {{1} } 被.Render()
的{{1}}直接调用。ClientScriptManager
没有任何用于注册 Page
元素以呈现到页面的实例方法。
BeginFormRender
实例的 ScriptManager
方法,但它所做的只是调用 <script>
、static
或 Page
。 Page.ClientScript.RegisterClientScriptBlock
控件必须放在您的 Page.ClientScript.RegisterClientScriptInclude
和 must be placed before any other WebControls that depend on ScriptManager
-registered scripts 中。您也不能在一个页面上拥有超过 1 个 Page.ClientScript.RegisterClientScriptResource
控件。
所以如果 <asp:ScriptManager>
只是包裹 <asp:Form>
,它实际上做了什么本身?
<asp:ScriptManager>
不同,ScriptManager
确实允许您删除脚本注册并获取当前注册的列表。
ClientScriptManager
而不是 ClientScriptManager
和注册的,您在 之前 删除了有问题的脚本 {{1} } 被调用(它发生在 ScriptManager
的 ScriptManger
事件中)。ClientScriptManager
处理为 ASMX 和 WCF 客户端代理自动创建 JavaScript 代码并将这些代码呈现为注册脚本。
ScriptManager.RegisterScripts()
集合的用途。对于每个 Page
子元素,它将生成一个 PreRender
,其中包含包装 ScriptManager
对每个 <asp:ScriptManager><Services>
方法的调用的函数。
<asp:ServiceReference />
方法存在于 <script>
类中,但您的 XMLHttpRequest
子类也需要应用 [WebMethod]
。[WebMethod]
也可以是 .asmx
子类上的 WebService
方法,但您需要设置 [ScriptService]
以使用这些方法。[WebMethod]
是 ASP.NET WebForms 不可或缺的一部分,并在您的 static
中呈现预注册的 Page
元素。EnablePageMethods="true"
是 ASP.NET WebForms 的可选扩展(作为 ASP.NET AJAX 的一部分)并且本质上扩展 ClientScriptManager
允许删除注册并生成 JavaScript 以更轻松地调用 <script>
<form>
中定义的 ScriptManager
方法或“页面方法”(这是一个 ClientScriptManager
[WebMethod]
子类,也带有 .asmx
)。