ASP.NET 魔法學院

Home Contact Syndicate this Site (RSS 2.0) Syndicate this Site (Atom) Login
  106 Posts :: 1 Stories :: 118 Comments :: 2 Trackbacks

News

☆ 有些事現在不做,就一輩子都不會做了 ☆

每月文章

隨筆分類

影像集

好站連結


Friday, August 29, 2008 #

前言

在「撰寫自用 Confirm 方法」一文中提到的「案例三:先執行伺服端程式再彈出詢問訊息,依用戶端回應再接續執行」,當用戶端回應詢問訊息後,會呼叫 __doPostBack() 函式來產生 PostBack 的動作,頁面再自行判斷 Me.Request.Form("__EVENTTARGET") 及 Me.Request.Form("__EVENTARGUMENT")  來處理後序的作業。可是這樣處理 PostBack 的方式略顯麻煩,換個角度思考,若 Page 也能像 GridView 一樣具有類似 RowCommand 的事件,可以處理這類的 PostBack 那不是更方便了嗎?所以本文將在 BasePage 加入 PageCommand 事件,針對這個案例改用 PageCommand 來處理。

 

程式實作

我們將使用「撰寫自用的 ScriptManager 來管理用戶端指令碼」文中提及的 TBBasePage 類別及 TBScriptManager 類別為基礎做擴展。首先在 TBBasePage 新增一個 PageCommand 事件,作法如下。

1.定義 PageCommand 事件。
2.新增 EventTarget 唯讀屬性,傳回 Me.Request.Form("__EVENTTARGET")。
3.新增 EventArgument 唯讀屬性,傳回 Me.Request.Form("__EVENTARGUMENT")。
4.覆寫 OnLoad 方法,判斷 EventTarget 及 EventArgument 屬性值,來決定是否引發 PageCommand 事件。

然後在 TBScriptManager 類別新增一個 GetPageCommandEventReference 方法,取得引發 PageCommand 事件的用戶端指令碼。

PageCommand 事件完成了,我們把「案例三:先執行伺服端程式再彈出詢問訊息,依用戶端回應再接續執行」使用 PageCommand 來改寫,它的程式流程如下。

請假單儲存(伺服端) -> 彈出詢問訊息(用戶端) -> 取得用戶端回應決定是否送審(伺服端)

第一個階段處理「請假單儲存(伺服端) -> 彈出詢問訊息(用戶端) 」,在下面的程式碼中,訊問訊息的回應結果無論是「確定」或「取消」都會引發 PageCommand 事件,CommandName 都是 "SaveConfirm",差別是 CommandArgument 的值不同。

第二階段在 PageCommand 事件處理用戶端詢問訊息的回應「取得用戶端回應決定是否送審(伺服端)」,在 PageCommand 事件中,我們只需判斷 e.CommandName 及 e.CommandArgument 來決定接續的執行動作即可。

posted @ 8:46 PM | Feedback (1)

前言

上一篇「讓 ASP.NET 也可以使用 MsgBox 方法」文章中提到如何封裝 JavaScript 的 alert 方法,另一個常使用在用戶端處理「詢問訊息」的就是 JavaScript 的 confirm 方法,在此篇文章我們將撰寫自用的 Confirm 方法,使頁面的程式碼儘量不要直接去撰寫 JavaScript 程式碼,以增加系統的維護性。

程式實作

我們將使用「撰寫自用的 ScriptManager 來管理用戶端指令碼」文中提及的 TBScriptManager 類別為基礎,在 TBScriptManager 類別新增處理「詢問訊息」會使用到相關方法。我們在 TBScriptManager 類別新增二個 GetConfirmScript 多載方法,用以取得詢問訊息相關的 JavaScript 程式碼;另新增 Confirm 方法來直接註冊詢問訊息的用戶端指令碼,以下將以實例說明這三個方法的使用時機及方式。

案例一:按鈕加上詢問訊息,按「確定」才會引發按鈕的 Click 事件

按鈕加上詢息訊息是常使用到的案例,例如按下刪除鈕時,先詢問用戶是否確定刪除資料,當按「確定」時才會真正去執行刪除動作。我們可以在 Page Load 事件中,去設定 Button.OnClientClick 屬性,加入詢問訊息的用戶端指令碼。

案例二:純用戶端的詢問訊息

詢問訊息只是在用戶端執行,並不會產生 PostBack。

案例三:先執行伺服端程式再彈出詢問訊息,依用戶端回應再接續執行

例如有登打請假單儲存時,執行儲存完畢要彈出一個是否送審詢問訊息。在 WinForm 撰寫這個程式碼非常單純,只要在儲存後彈出詢問訊息,等待用戶回應接續執行後面的程式碼即可。可是在 WebForm 要撰寫相同的功能就有點麻煩了,因為整個程式的流程是在伺服端及用戶端交互運作。

請假單儲存(伺服端) -> 彈出詢問訊息(用戶端) -> 取得用戶端回應決定是否送審(伺服端)

在 WebForm 要處理這類問題,要分為二個階段處理,第一個階段處理「請假單儲存(伺服端) -> 彈出詢問訊息(用戶端) 」,在下面的程式碼中,訊問訊息的回應結果無論是「確定」或「取消」都會產生 PostBack 動作傳不同的參數。

第二階段在 Page Load 事件處理用戶端詢問訊息的回應「取得用戶端回應決定是否送審(伺服端)」

posted @ 8:42 PM | Feedback (0)

使用 VB6 或 VB.NET 的開發人員,一定常會使用到 MsgBox 這個函式來顯示訊息,如果使用 VB.NET 在開發 ASP.NET 程式,會發現似乎 MsgBox 這個函式好像可以使用,就直接使用 MsgBox 來顯示訊息。

在 VS 開發環境中執行程式,MsgBox 函式好像也可以正常顯示訊息;可是一旦網站發佈出去後,就會發現 MsgBox 函式失效了。這是什麼原因呢?MsgBox 函式是伺服端的語言,而用戶端只能透過瀏覽器解析 HTML 及 JavaScript,所以 MsgBox 函式是無法使用在 ASP.NET 的程式,只能在開發偵錯時使用。在 ASP.NET 中,要在用戶端顯示訊息正確的方法是要使用 RegisterStartupScript 方法來輸出 JavaScript 的 alert 函式。

是不是覺得在 ASP.NET 中要顯示訊息麻煩多了,能否讓 ASP.NET 中也可以使用 MsgBox 來顯示訊息呢?其實方法很簡單,就是自己寫一個 MsgBox 方法就好了,就可以延用以前習慣的 MsgBox 來顯示訊息。我們在 BasePage 中撰寫 MsgBox 方法,這個 MsgBox 方法還處理訊息文字中含「單引號」及「換行」的部分,將這些特殊字串轉換為對應的 JavaScript 跳脫字元。

所有繼承 BasePage 的頁面都可以使用 MsgBox 方法來顯示訊息。

備註:處理 JavaScript 的相關函式,筆者比較建議使用「撰寫自用的 ScriptManager 來管理用戶端指令碼」一文中提供的方式來處理,所以可以將 MsgBox 方法撰寫在該文中的 TBScriptManager 類別。

posted @ 8:38 PM | Feedback (0)

Friday, July 11, 2008 #

Strings.Replace 方法是用在字串取代常用方法,常用的呼叫方式如下

可是最近發現一個問題,就是當原字串為 String.Empty (空字串) 時,其傳回值會為 Nothing。

如下程式碼會發生「參考的物件具有 'Nothing' 的值」的錯誤訊息。因為原字串為空字串,透過 Strings.Replace 方法會傳回 Nothing,所以會造成這個錯誤。

所以在使用 Strings.Replace 方法要特別注意這點,防止發生異常的錯誤。而我的作法就是撰寫另一個 StrReplace 方法來取代 Strings.Replace 方法,防止這類錯誤。

posted @ 12:44 AM | Feedback (1)

Sunday, June 22, 2008 #

摘要

之前在「Calendar 動態產生子控制項的 Event Handler」一文中有提到如何處理 Calendar 在 DayRender 事件動態產生按鈕的事件處理,文中最後有提及,若 Calendar 控制項有類似 GridView 控制項中有 RowCommand 事件,在使用上就可以更簡化。所以本文將擴展 Calendar 控制項,新增 DayCommand 事件,就動態產生的按鈕可以可以引發 DayCommand 事件,以便做後序的命令處理。

 

擴展 Calendar 控制項

繼承 Calendar 命名為 TBCalendar,新增 DayCommand 事件,覆寫 RaisePostBackEvent 方法,此方法是在處理引發 PostBack 產生的控制項事件,在此判斷若 PostBack 傳入的引數為 DayCommand${0}${1} 格式 (其中 {0} 為 CommandName,{1} 為日期),則引發 DayCommand 事件。另外新增 GetDayCommandEventReference 方法,提供取得引發 DayCommand 事件的用戶端指令碼。

測試程式

在頁面上放置 TBCalendar 控制項,在 DayRender 事件中動態產生一個 HtmlButton 按鈕,並利用 GetDayCommandEventReference 方法取得引發 DayCommand 事件的用戶端指令碼。在 DayCommand 事件中將 e.CommandName 及 e.Date 輸出在頁面上。

執行程式,按下某一日期的 [刪除] 鈕,就會引發其對應的 DayCommand 事件。

posted @ 7:53 PM | Feedback (1)