运行Async任务的WebForms页面中的AjaxControlToolkit扩展程序(或任何其他扩展程序存在问题)。如果扩展程序最初不可见,并且在运行异步任务的情况下使它可见(例如,是否应根据异步读取的数据确定可见性),则将获得以下System.ArgumentException:
Extender control '[ControlID]' is not a registered extender control.
Extender controls must be registered using RegisterExtenderControl() before calling RegisterScriptDescriptors().
经过一些分析,这是导致此情况的原因。
ScriptManager.RegisterExtenderControl()
OnPreRender
方法。而且,ScriptManager会抛出异常如果RegisterExtenderControl()
在除预渲染。OnPreRender
方法不会被调用,因此扩展器控件将不会被注册。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>
SetControlVisible
方法设置控件的可见性。此替代方法的完整源代码发布在这里:https://github.com/Xomega-Net/XomegaFramework/blob/master/src/Xomega.Framework.Web/Views/WebPage.cs