當然如果整個載入過程只有Page_Load的話,這個做法都還可以的。但假如還有其他Stage,例如Page_Init , Page_LoadComplete... (可參考ASP.NET Page Life Cycle Overview),單純地退出Page_Load事件就可以為你帶來一些程式上的錯誤。
當然概念上,大家要注意,即使你沒有寫上其他Stage的程式碼,但Runtime時,ASP.NET都會經過的,所以不要認為只把程式碼放進Page_Load事件中,便不會觸發其他Stage Event。
以下面段Code為例,網頁載入的過程會經過三個Stage : Page_Init => Page_Load => Page_LoadComplete
假如我使用return;(Exit Sub)的話 :
partial class DefaultPage : System.Web.UI.Page
{
protected void Page_Init(object sender, System.EventArgs e)
{
object intNum = "abcde";
int _intNum = 0;
if (!Int32.TryParse(intNum, _intNum)) {
return;
}
System.Diagnostics.Debug.Print("Page_Init is Loaded.");
}
protected void Page_Load(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_Load is Loaded.");
}
protected void Page_LoadComplete(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_LoadComplete is Loaded.");
}
}
Output Window便會顯示出
Page_Load is Loaded. Page_LoadComplete is Loaded.
換句話說,return並不會中止其後的事件。但如果我們使用throw的話:
partial class DefaultPage : System.Web.UI.Page
{
protected void Page_Init(object sender, System.EventArgs e)
{
object intNum = "abcde";
int _intNum = 0;
if (!Int32.TryParse(intNum, _intNum)) {
throw;
}
System.Diagnostics.Debug.Print("Page_Init is Loaded.");
}
protected void Page_Load(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_Load is Loaded.");
}
protected void Page_LoadComplete(object sender, System.EventArgs e)
{
System.Diagnostics.Debug.Print("Page_LoadComplete is Loaded.");
}
}
這樣Page_Load和Page_LoadComplete都不會執行,而頁面會轉去錯誤信息頁。
當然throw也是一個決定性的做法,正常未必需要因為不符合要求就把瀏覽者轉向錯誤頁面。
但大家從這個範例也可以看出一些ASP.NET Page Cycle上要注意的地方。
You are MVP now? When? HK MVP? Why not see you on TechDays? Will u go MVP Open Days?
回覆刪除