protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) { /* 首次載入初始化 */ }
}
IsPostBack 指示頁面是否因用戶回傳而載入,避免重複初始化。
繼承 WebControl 並實作 IPostBackDataHandler:
public class NewTextBox : WebControl, IPostBackDataHandler
{
public event EventHandler TextChanged;
public string ViewText
{
get { return ViewState["Text"]?.ToString() ?? String.Empty; }
set { ViewState["Text"] = value; }
}
protected override HtmlTextWriterTag TagKey => HtmlTextWriterTag.Input;
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.AddAttribute(HtmlTextWriterAttribute.Value, ViewText);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
base.AddAttributesToRender(writer);
}
// IPostBackDataHandler 實作
public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
string posted = postCollection[postDataKey];
if (posted != ViewText)
{
ViewText = posted;
return true; // 資料異動,引發 RaisePostDataChangedEvent
}
return false;
}
public void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}
protected virtual void OnTextChanged(EventArgs e)
{
TextChanged?.Invoke(this, e);
}
}
LoadPostData,比對舊值。true,頁面稍後呼叫 RaisePostDataChangedEvent,觸發 TextChanged 事件。TextChanged 執行商業邏輯。掌握此介面,即可開發支援 ViewState 與回傳資料同步的自訂輸入控件。