自訂控制項繼承 WebControl 並實作 ICallbackEventHandler,提供無整頁回傳的伺服器互動。
protected override void RenderContents(HtmlTextWriter output) {
output.RenderBeginTag(HtmlTextWriterTag.Div);
output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
output.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
output.AddAttribute(HtmlTextWriterAttribute.Name, ClientID);
output.AddAttribute(HtmlTextWriterAttribute.Value, Text);
output.AddAttribute("onblur", "ClientCallback();"); // 失焦觸發
output.RenderBeginTag(HtmlTextWriterTag.Input);
output.RenderEndTag(); // input
output.RenderEndTag(); // div
}
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
// 取得焦點
Page.ClientScript.RegisterStartupScript(typeof(Page), "ControlFocus",
"document.getElementById('" + ClientID + "').focus();", true);
// 註冊回呼函式
string callbackRef = Page.ClientScript.GetCallbackEventReference(this, "args", "CallbackHandler", null, "ErrorHandler", true);
Page.ClientScript.RegisterStartupScript(typeof(Page), "ClientCallback",
"function ClientCallback() { args=document.getElementById('" + ClientID + "').value;" + callbackRef + " }", true);
}
public string RaiseCallbackEvent(string eventArgument) {
int result;
if (!Int32.TryParse(eventArgument, out result))
throw new Exception("輸入必須為數字");
return "Valid Data";
}
function CallbackHandler(args, ctx) { alert("資料驗證通過:" + args); }
function ErrorHandler(args, ctx) { alert("錯誤:" + args); }
GetCallbackEventReference 產生 WebForm_DoCallback 呼叫鏈。RaiseCallbackEvent 回傳字串結果。