2009/01/10

在ASP.NET 2.0中如何處理UI 繼承的問題?

我想設計一個有繼承功能的WebForm,類似Window Form的作法。但是,ASP.NET的WebForm,其實是無法作可視化的Web UI繼承,所以只有Code-Behind的程式碼是可以繼承的。

概念如下:
image

所以,我們先在網站專案中新增一個Web頁面:Base_swWebForm.aspx。再增加一張網頁:TestPage.aspx。
由上圖的結構,我們可以知道BaseForm是Base_swWebForm.aspx。故在Base_swWebForm.aspx.cs中撰寫相關程式碼。而TestPage.aspx.cs 則是撰擇繼承Base_swWebForm.aspx,再進行進一步的程式碼撰寫。

程式碼如下:

WebForm Code-behind 的程式碼:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Base_swWebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "common", "../Scripts/common.js");
}

/// <summary>
///
取得客戶端真實IP Address
/// </summary>
/// <returns></returns>
protected string GetClientIP()
{
string ip = null;
if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) || Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToUpper().IndexOf("UNKNOWN") > 0)
{
ip = Request.ServerVariables["REMOTE_ADDR"];
}
else if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(",") > 0)
{
ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Substring(1, Request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(",") - 1);
}
else if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(";") > 0)
{
ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Substring(1, Request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(";") - 1);
}
else
{
ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}

//return ip.Replace(' ', string.Empty).ToString();
return ip.Trim().ToString();
}

/// <summary>
///
顯示MessageBox
/// </summary>
/// <param name="msg">
訊息</param>
protected void ShowMessage(string msg)
{
this.Response.Write("<Script language='JavaScript'>\nwindow.alert('" + msg + "');\n</Script>");
}
}
在Base_swWebForm.aspx.cs的程式碼做了三件事:
1. 註冊網頁上會用到的共用Script File。
2. 提供取得Client IP的Method:GetClientIP();
3. 提供類似MessageBox.Show的功能:ShowMessage(msg);



WebForm Code-behind 的程式碼:



using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.IO;

public partial class Base_TestPage : Base_swWebForm //System.Web.UI.Page Base_TestPage
{
protected void Button2_Click(object sender, EventArgs e)
{
ShowMessage(GetClientIP());
}

}
TestPage.aspx.cs,則因為是測試網頁,所以程式碼很簡單,只有一個Button2而已。而在Button2_Click時,呼叫Base_swWebForm上原有提供的methods,用來確定繼承是成功的。


此時,你會發現程式是錯誤的。因為沒有辦法繼承Base_swWebForm。你必須將Base_swWebForm.aspx.cs這個檔案移動到Web專案的App_Code的目錄下,而原有的Base_swWebForm.aspx這個檔案,因為ASP.NET 2.0 原本就達到頁面可視繼承,就直接刪除吧!!
此時,你會發現程式碼就會正確,也達到Code-behind的繼承,而每個繼承的頁面再也不必寫, Include common.js及GetClientIP(), ShowMessage 這些功能。

0 意見: