封裝登錄、查詢等通用界面為用戶控件時,控件內部按鈕點擊後的具體業務邏輯(如驗證帳號、寫入日誌)由宿主頁面決定。委托讓控件「不關心具體做什麼,只負責通知發生了什麼」,實現控件與業務邏輯解耦。
public partial class LoginControl : System.Web.UI.UserControl
{
// 定義事件,類型為 EventHandler
public event EventHandler LoginClick;
protected void Page_Load(object sender, EventArgs e) { }
protected void btnLogin_Click(object sender, EventArgs e)
{
// 觸發事件,通知訂閱者
LoginClick?.Invoke(sender, e);
}
}
<uc1:LoginControl ID="LoginControl1" runat="server" OnLoginClick="Login_Click" />
protected void Login_Click(object sender, EventArgs e)
{
Response.Write("<script>alert('Logined')</script>");
}
實際場景常需獲取用戶輸入的帳號密碼,需自定義 EventArgs。
public class LoginEventArgs : EventArgs
{
public string UserName { get; set; }
public string Password { get; set; }
}
public delegate void LoginEventHandler(object sender, LoginEventArgs e);
public partial class LoginControl : System.Web.UI.UserControl
{
public event LoginEventHandler LoginClick;
protected void btnLogin_Click(object sender, EventArgs e)
{
var args = new LoginEventArgs
{
UserName = txtUserName.Text,
Password = txtPassword.Text
};
LoginClick?.Invoke(this, args);
}
}
protected void Login_Click(object sender, LoginEventArgs e)
{
Response.Write($"<script>alert('UserName:{e.UserName}, Password:{e.Password}')</script>");
}
| 層級 | 做法 | 優勢 |
|---|---|---|
| 基礎 | 用 EventHandler + EventArgs | 簡單、無數據傳遞場景 |
| 進階 | 自定義 EventArgs + 強類型委托 | 類型安全、IntelliSense 支持、攜帶豐富數據 |
LoginClicked、DataSaved)(object sender, TEventArgs e)?.Invoke 防空引用掌握委托在用戶控件中的應用,能讓你輕鬆構建高復用、低耦合的 Web 組件庫。