用于执行JS时ScriptManager和ClientScript之间的差异?

时间:2011-08-13 06:41:01

标签: c# asp.net

有人可以向我解释ScriptManager和ClientScript之间的区别吗?

当我在Button_Clicked事件中使用它时,ClientScript运行良好,但是当我在GridView的GridView_RowUpdated中使用它时,它不起作用。 (GirdView包含在更新面板中)。然后我尝试了ClientScript,在这种情况下它运行得很好。

2 个答案:

答案 0 :(得分:12)

您已经确定了主要区别。 ScriptManager旨在与异步回发一起使用,这就是它与UpdatePanel一起使用的原因。 ClientScript类用于同步回发。因此,如果您要从UpdatePanel回发,请务必使用ScriptManager而不是ClientScript。

ScriptManager

答案 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> 元素可以使用不同的方法注册:

    1. RegisterClientScriptBlock
    2. RegisterClientScriptInclude
    3. 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 的扩展。

    • 它于 2010 年在 ASP.NET 4.0 中内置于 ASP.NET(而不是作为扩展)。
    • 它位于 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>staticPage
  • Page.ClientScript.RegisterClientScriptBlock 控件必须放在您的 Page.ClientScript.RegisterClientScriptIncludemust 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} } 被调用(它发生在 ScriptManagerScriptManger 事件中)。
    • 此外,ClientScriptManager 处理为 ASMX 和 WCF 客户端代理自动创建 JavaScript 代码并将这些代码呈现为注册脚本。
      • 这就是 ScriptManager.RegisterScripts() 集合的用途。对于每个 Page 子元素,它将生成一个 PreRender,其中包含包装 ScriptManager 对每个 <asp:ScriptManager><Services> 方法的调用的函数。
        • <asp:ServiceReference /> 方法存在于 <script> 类中,但您的 XMLHttpRequest 子类也需要应用 [WebMethod]
        • [WebMethod] 也可以是 .asmx 子类上的 WebService 方法,但您需要设置 [ScriptService] 以使用这些方法。

TL;DR:

  • [WebMethod] 是 ASP.NET WebForms 不可或缺的一部分,并在您的 static 中呈现预注册的 Page 元素。
  • EnablePageMethods="true" 是 ASP.NET WebForms 的可选扩展(作为 ASP.NET AJAX 的一部分)并且本质上扩展 ClientScriptManager允许删除注册并生成 JavaScript 以更轻松地调用 <script> <form> 中定义的 ScriptManager 方法或“页面方法”(这是一个 ClientScriptManager [WebMethod] 子类,也带有 .asmx)。