异步WebForms页面中的AjaxControlToolkit问题

问题描述 投票:0回答:1

运行Async任务的WebForms页面中的AjaxControlToolkit扩展程序(或任何其他扩展程序存在问题)。如果扩展程序最初不可见,并且在运行异步任务的情况下使它可见(例如,是否应根据异步读取的数据确定可见性),则将获得以下System.ArgumentException:

Extender control '[ControlID]' is not a registered extender control.
Extender controls must be registered using RegisterExtenderControl() before calling RegisterScriptDescriptors().

经过一些分析,这是导致此情况的原因。

  1. ExtenderControl基类,所有AjaxControlToolkit扩展程序子类,在其子类中调用ScriptManager.RegisterExtenderControl()OnPreRender方法。而且,ScriptManager会抛出异常如果RegisterExtenderControl()在除预渲染。
  2. 对于在PreRender阶段不可见的控件,OnPreRender方法不会被调用,因此扩展器控件将不会被注册。
  3. WebForms页面运行所有异步任务PreRender阶段之后,并且在渲染阶段之前。因此,如果您使扩展器在异步任务,那么它将在PreRender中不可见阶段,并且仅在“渲染”阶段。
  4. 最后,扩展程序控件调用ScriptManager.RegisterScriptDescriptors()在渲染阶段,由于控件没有被抛出而抛出了上述异常在PreRender阶段注册。

有人找到了解决方法或解决方法吗?

这似乎是WebForms中的一个巨大限制,在WebForms中,您不能在同一页面中同时有效地使用异步任务和扩展程序控件。

下面是说明此问题的示例网页。

<%@ Page Async="true" MasterPageFile="~/Site.Master" Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %>
<%@ Import Namespace="System.Threading.Tasks" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <asp:Panel ID="Panel1" runat="server">
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <ajaxToolkit:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="TextBox1" />
    </asp:Panel>
</asp:Content>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Panel1.Visible = false;
        RegisterAsyncTask(new PageAsyncTask(ReadAsync));
    }

    // Making the panel visible below will result in the following exception:
    // Extender control 'CalendarExtender1' is not a registered extender control.
    // Extender controls must be registered using RegisterExtenderControl() before calling RegisterScriptDescriptors().
    private async Task ReadAsync()
    {
        Panel1.Visible = true;
        await Task.CompletedTask;
    }
</script>
asp.net asynchronous webforms ajaxcontroltoolkit
1个回答
0
投票
[基本上,您的页面将跟踪具有扩展程序的控件,并且可以在异步任务中运行时更改其可见性。然后,它将在适当的时候使这些控件在PreRender上临时可见,以避免该错误,然后在PreRender完成后根据需要隐藏它们。这里的关键是使用页面的新SetControlVisible方法设置控件的可见性。

此替代方法的完整源代码发布在这里:https://github.com/Xomega-Net/XomegaFramework/blob/master/src/Xomega.Framework.Web/Views/WebPage.cs

© www.soinside.com 2019 - 2024. All rights reserved.