關於對導航方式的論述,可以參考:幾種頁面導航方式
Asp.Net中存在以下幾種導航方式:
導航方法 |
用途 |
HyperLink Server控制項 |
導航到另一個頁面 |
Response.Redirect() |
使用代碼導航到另一個頁面。功能同HyperLink相同 |
Server.Transfer() |
結束本頁面,執行另一個頁面。只對.aspx頁面有效 |
Server.Execute() |
保留顯示本頁面內容的同時,執行其他頁面,2個頁面的顯示資訊會顯示在一起。只對.aspx頁面有效 |
Window.Open() |
在用戶端新開一個頁面 |
下面詳細說明:
HyperLink 控制項:
接收使用者滑鼠的點擊事件,導航到HyperLink.NavigateUrl屬性設定的頁面。基本用途就是導航,自身也帶有Load,UnLoad,Init,PreRender事件,執行特定的操作。
如在一個頁面的HyperLink控制項的Unload事件中定義Application變數name: private void HyperLink1_Unload(object sender, System.EventArgs e)
{
Application["name"]="Pierce";
}
然後在導航頁面中讀取此變數: private void Page_Load(object sender, System.EventArgs e)
{
Response.Write(Application["name"]);
}
原文中說,HyperLink控制項不能執行任何Server端事件,但是上面的代碼確實執行了Server端代碼。
Response.Redirect():
通過代碼實現導航目的,會產生一個Round-Trip過程同使用者互動,同時可以通過字串傳遞參數,如:
private void LinkButton1_Click(object sender, System.EventArgs e)
{
// Display next page.
Response.Redirect("NextPage.aspx?name=pierce");
}
Server.Transfer():
同HyperLink和Response.Redirect()相似,不同在於:
Server.Transfer()可以在從源頁面到目標頁面的傳遞過程中,保留源頁面的一些資訊。將Transfer()的第2個參數設為True,可以使源頁面的ViewState,QueryString,甚至過程資訊在目標頁面可以保留。
原文說:如過使用這項功能,需要把頁面的EnableViewStateMac值設為False,即不執行Hash操作。預設狀況下,Asp.Net 會把ViewState的值作Hash處理,只有把EnableViewState=False,關閉此Hash功能,才可以使後續頁面讀取ViewState的資訊。但是經過測試,將EnableViewState=true,對於讀取ViewState的資訊沒有影響。ViewState中的字元預設會被編碼為Base64格式的,雖然不易讀,但是沒有加密。在machine.config中可以控制加密方式,加密操作需要在Machine層完成,比較消耗系統資源。 如果根據machineKey執行加密,那麼就不可以直接讀取ViewState的值。
例子:
建立立頁面WebForm1.aspx,加入TextBox控制項,名稱為tb,加入Button控制項,名稱Button1,tb.Text="test", private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("WebForm2.aspx",true);
}
建立WebForm2.aspx, private void Page_Load(object sender, System.EventArgs e)
{
System.Collections.Specialized.NameValueCollection col=Request.Form;
Response.Write(col["tb"]);
}
通過測試,WebForm2會顯示test,說明讀取到了WebForm1.aspx的ViewState。
Server.Execute():
可以在不離開當前頁面的同時,執行其他頁面。這個方法可以在當前頁面中顯示其他頁面的執行結果。
原文中同樣要求把EnableViewStateMac=false,但是測試結果表明,這個選項的值對Execute()的執行沒有影響。
通過使用
System.IO.StringWriter writer=new System.IO.StringWriter();
Server.Execute("WebForm2.aspx",writer);
Response.Write(writer.ToString());
WebForm1會顯示WebForm2的各種控制項和執行結果。
WebForm2中的事件可以執行,如果是引發Post-back的控制項的事件,會清除WebForm1的控制項。
Window.Open():
這個方法存在於指令檔,目的是使使用者瀏覽器新開視窗,只能在用戶端執行。
如建立如下Html Button: <INPUT style="Z-INDEX:
102; LEFT: 55px; WIDTH: 81px; POSITION: absolute; TOP: 156px; HEIGHT:
24px" onclick="window.open('webform2.aspx')" type="submit"
value="New Window">
可以新開視窗,指向WebForm2.aspx頁面。
參考:
Ms Develop Web Application with Microsoft Visual Basic.Net and Microsoft Visual C#.Net
2002