ASP.NET AJAX サーバー コントロールの作成。RenderContents メソッドをオーバーライドして、以下に示すコードを配置しました。
protected override void RenderContents(HtmlTextWriter writer)
{
var updatePanel = new UpdatePanel();
updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
updatePanel.ClientIDMode = ClientIDMode.AutoID;
updatePanel.ID = "CaptchaUpdatePanel";
updatePanel.ChildrenAsTriggers = true;
//var placeHolder = new PlaceHolder();
var hiddenField = new HiddenField();
hiddenField.ID = "captchaKey";
updatePanel.ContentTemplateContainer.Controls.Add(hiddenField);
var panel = new Panel();
panel.ID = "Captcha";
var imgButton = new ImageButton();
imgButton.ID = "RefreshCaptcha";
imgButton.TabIndex = 0;
imgButton.AlternateText = "Refresh Captcha Characters";
imgButton.ImageUrl = RefreshButtonPath;
imgButton.Width = 36;
imgButton.Height = 36;
panel.Controls.Add(imgButton);
updatePanel.ContentTemplateContainer.Controls.Add(panel);
AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = "CaptchaRefresh";
trigger.EventName = "Click";
updatePanel.Triggers.Add(trigger);
updatePanel.ContentTemplateContainer.RenderControl(writer);
base.RenderContents(writer);
}
コントロールをコンパイルして Web フォーム ページにドロップすると、UpdatePanel が機能しないことがわかりました。UpdatePanel 内のボタンをクリックすると、非同期ではなく完全なポストバックが実行されます。
うまくいかなかったので、私はウェブで答えを探していました。
AJAX サーバー コントロール内に UpdatePanel を配置することをお勧めします。UserControl を使用して、この類似のタスクを実行することに成功しました。
HTML スクリプトは以下のとおりです。
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Register Assembly="CaptchaControl" Namespace="CaptchaControlx" TagPrefix="cc1" %>
<!DOCTYPE html>
<html>
<head runat="server">
<title></title>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString();
}
</script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<form runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<cc1:captcha runat="server" />
</form>
</body>
</html>