Ext.NET(原 Coolite)是 Ext JS 的 ASP.NET 伺服器端封裝。Button 控件支援三種互動模式:純客戶端、服務端 DirectEvent、服務端帶參數 DirectEvent,以及自定義屬性注入客戶端。
<ext:Button ID="Button1" runat="server" Text="客戶端點擊">
<Listeners>
<Click Handler="Greet()" />
</Listeners>
</ext:Button>
<script>
function Greet() { alert("Hello World!"); }
</script>
特點: 無 Postback,無伺服器負擔,適合 UI 交互、驗證、彈窗等純前端邏輯。
<ext:Button ID="Button1" runat="server" Text="服務端點擊">
<DirectEvents>
<Click OnEvent="MyButtonClickHandler" />
</DirectEvents>
</ext:Button>
protected void MyButtonClickHandler(object sender, DirectEventArgs e) {
X.Msg.Alert("標題", "Hello World!").Show();
}
關鍵點:
DirectEventArgs 提供 ExtraParams、EventArguments 等豐富上下文EventArgs 將失去 ExtraParams 存取能力X.Msg.Alert 需 .Show() 顯式渲染,或 JS 錯誤中斷<ext:Button ID="Button1" runat="server" Text="帶參點擊">
<DirectEvents>
<Click OnEvent="MyButtonClickHandler">
<ExtraParams>
<ext:Parameter Name="param1" Value="value1" Mode="Raw" />
<ext:Parameter Name="userId" Value="App.currentUser.id" Mode="Raw" />
</ExtraParams>
</Click>
</DirectEvents>
</ext:Button>
protected void MyButtonClickHandler(object sender, DirectEventArgs e) {
string p1 = e.ExtraParams["param1"]; // "value1"
string uid = e.ExtraParams["userId"]; // 客戶端 JS 變數值
X.Msg.Alert("收到", $"{p1}, {uid}").Show();
}
Mode="Raw" 表示 Value 視為 JS 表達式(如變數、函數調用);預設 Mode="Value" 視為字面字串。
<ext:Button ID="Button1" runat="server" Text="自定義屬性">
<Listeners>
<Click Handler="CusProperty(this);" />
</Listeners>
<CustomConfig>
<ext:ConfigItem Name="cusProperty1" Value="theValue" Mode="Value" />
<ext:ConfigItem Name="dynamicVal" Value="Date.now()" Mode="Raw" />
</CustomConfig>
</ext:Button>
<script>
function CusProperty(btn) {
alert("靜態值:" + btn.cusProperty1); // "theValue"
alert("動態值:" + btn.dynamicVal); // 當前時間戳
}
</script>
原理: CustomConfig 將屬性序列化到客戶端組件實例,this 即該 Button 的 JS 物件。
| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 簡單提示、關閉視窗、客戶端驗證 | Listeners (客戶端) | 零延遲、無伺服器壓力 |
| 資料庫操作、權限檢查、複雜業務邏輯 | DirectEvents (服務端) | 安全、可用伺服器資源 |
| 需傳遞動態客戶端狀態(Grid 選中行、表單值) | DirectEvents + ExtraParams (Raw) | 靈活獲取運行時數據 |
| 組件行為客製化、第三方庫整合 | CustomConfig | 不修改源碼擴展屬性 |
runat="server"、ID 唯一、頁面有 <ext:ResourceManager>Mode 正確、JS 表達式無語法錯誤(F12 Network 觀察 Request Payload).Show(),或使用 X.Msg.Show(new MessageBoxConfig { ... })