【发布时间】:2020-02-09 23:09:25
【问题描述】:
运行异步任务的 WebForms 页面中的 AjaxControlToolkit 扩展程序(或任何其他扩展程序)存在问题。如果您的扩展程序最初是不可见的,并且您运行了一个异步任务以使其可见(例如,如果应根据您异步读取的数据确定可见性),那么您将获得以下 System.ArgumentException:
Extender control '[ControlID]' is not a registered extender control.
Extender controls must be registered using RegisterExtenderControl() before calling RegisterScriptDescriptors().
经过一些分析,这是造成这种情况的原因。
- ExtenderControl 基类,它所有的 AjaxControlToolkit 扩展器
子类,在其中调用
ScriptManager.RegisterExtenderControl()OnPreRender方法。而且,ScriptManager 会抛出异常 如果RegisterExtenderControl()在除此之外的任何阶段被调用 预渲染。 - 对于在 PreRender 阶段不可见的控件,
OnPreRender方法将不会被调用,因此扩展程序 控件不会被注册。 - WebForms 页面在 PreRender 阶段之后运行所有异步任务,并且 在渲染阶段之前。所以,如果你让你的扩展器在 异步任务,那么它将在 PreRender 中不可见 阶段,并且仅在渲染阶段。
- 最后,扩展器控制调用
ScriptManager.RegisterScriptDescriptors()在渲染阶段, 由于没有控制而引发上述异常 在 PreRender 阶段注册。
有没有人找到解决方法或解决方法?
这似乎是 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