在ASP.NET StartKit TimeTracker中使用了大量QueryString
例如:
http://localhost/TTWebCSVS_cn/ProjectList.aspx?index=2
現在讓我們在IE地址裡面敲入下面的地址,會出現什麼情況?
http://localhost/TTWebCSVS_cn/ProjectList.aspx?index=a2
或者
http://localhost/TTWebCSVS_cn/ProjectList.aspx?index=
很明顯參數index要求接到的是整數.而我們敲入的地址中參數不符合要求,異常.
那有沒有辦法避免這類情況的發生呢?
其實我們可以定義一個頁面基類.
public class PageBase :System.Web.UI.Page
讓系統中的其他aspx頁面繼承PageBase.
把取得QueryString中數值寫成方法,放在基類中.
在基類編寫3個方法.
<summary>
/**//// 得到QueryString參數的數值
/// </summary>
/// <param name="queryStringName">QueryString參數的名稱</param>
/// <param name="result">QueryString參數的數值(string類型)</param>
protected void GetQueryStringValue(string queryStringName,out string result)
{
result=String.Empty;
result=Request.QueryString[queryStringName];
//沒有接到參數,異常,轉到出錯誤頁
if (result==null || result=="")
{
errorPageRedirect();
}
}
/**//// <summary>
/// 得到QueryString參數的數值
/// </summary>
/// <param name="queryStringName">QueryString參數的名稱</param>
/// <param name="result">QueryString參數的數值(int類型)</param>
protected void GetQueryStringValue(string queryStringName,out int result)
{
string str;
GetQueryStringValue(queryStringName,out str);
result=0;
try
{
result=Convert.ToInt32(str);
}
catch(OverflowException)
{
//小於int的MinValue或大於int的MaxValue,異常,轉到出錯誤頁
errorPageRedirect();
}
catch(FormatException)
{
//非數字字元,異常,轉到出錯誤頁
errorPageRedirect();
}
catch(ArgumentException)
{
//Null 參考,異常,轉到出錯誤頁
errorPageRedirect();
}
}
/**//// <summary>
/// 發生錯誤時,頁面轉向
/// </summary>
protected void errorPageRedirect()
{
Response.Redirect("ErrorQueryString.aspx",true);
}
這樣我們在aspx頁面中只要調用父類方法即可.方法會為我們處理異常.
例如:
int id;
GetQueryStringValue("",out id);
要是異常,方法會為我們處理,並轉向頁面ErrorQueryString.aspx
我們還可以在ErrorQueryString.aspx頁面中做錯誤資訊記錄.例如把錯誤資訊寫到日誌或者錯誤資訊表中.
上面的方法現在只可以取string類型和int類型2種類型的參數
我們可以根據需要重載GetQueryStringValue方法即可.
我就在項目中重載了3次,還可以取枚舉型別參數