摘要:翻譯自www.asp.net的一篇文章,Cross Page Postback in ASP.Net 2.0,作者是Dipal Choksi。在ASP.Net2.0中,跨頁提交允許把一個頁面的回調回調提交到一個不同的網頁中。本文中我們將探索一些不同的跨頁提交的方法。另,翻譯的特別困難,請各位朋友批評指正。
在ASP.Net2.0中,跨頁提交允許把一個頁面的回調回調提交到一個不同的網頁中。本文中我們將探索一些不同的跨頁提交的方法。
ASP.Net1.1只提供了提交到本頁的方式。在很多情況下,我們的解決方案中會有跨頁的提交的需求,傳統的方法都是通過Response,Redirect或者Server.Transfer的方式轉移到另外的一頁然後模擬出一個跨頁回調的效果。
ASP.Net2.0提供了這種能實現從一個表單頁提交到另一個表單頁的跨頁提交的功能。
如何實現跨頁提交
要實現跨頁提交,在源表單頁裡,需要設置控件的PostBackURL這個屬性來實現IButtonControl(比如Button,ImageButton,LinkButton)接口來定位到目標表單頁。當用戶單擊這個button控件的時候,表單頁就會跨頁提交到目標表單頁。不需要在源表單頁中進行任何設置或編寫任何的代碼。
通過FindControl方法在目標頁中檢索源表單頁中的信息
目標表單頁獲得“跨”過來的那一頁請求的信息是通過一個不為空的PreviousPage方法。這個屬性代表著源表單頁並且為源表單頁和其控件建立引用。
源表單頁上的控件在目標頁上可以通過PreviousPage的FindControl方法來獲得。
protected void Page_Load(object sender, EventArgs e)
{
...
TextBox txtStartDate = (TextBox) PreviousPage.FindControl("txtStartDate ");
...
}
這時目標表單頁是不知道源表單頁的任何信息的。PreviousPage這個屬性的類型是Page,所以檢索控件就可以使用FindControl的方法,但開發人員需要對源表單頁的結構有一個大體的了解。而使用FindControl方法必然會有一些限制,比如FindControl方法只能依靠開發人員提供的控件的id屬性來定位到一個控件。如果源表單頁的控件id變了的話那麼這個方法就有可能失效。FindControl方法只能處理那些在當前容器裡的控件,如果開發人員需要檢索在其它控件中(容器)的控件的話,那麼首先需要獲得其父控件的一個引用。
通過@PreviousPageType指令在目標頁中檢索源表單頁的信息
另外一個方法就是在源表單頁已經確定的情況下,使用@PreviousPageType指令。這個指令可以在目標表單頁中以強類型的方式訪問源表單頁。這個指令指定源表單頁使用VirtualPath屬性還是TypeName屬性。PreviousPage屬性返回一個強類型的結果來對源表單頁進行引用。其允許訪問源目標頁的公共屬性。
SourcePage.ASPx:
<form runat="server" >
...
<ASP:textbox runat="server" id="txtFirstName"/>
<ASP:textbox runat="server" id="txtLastName"/>
<asp:button runat="server" id="btnViewReport" Text="VIEw Report" PostbackURL="~/targetpage.ASPx" />
...
public string FirstName
{
get { return txtFirstName.Text; }
}
...
TargetPage.ASPx
<%@ PreviousPageType VirtualPath="sourcepage.ASPx" %>
string strFirstName;
strFirstName = PreviousPage.FirstName //Strongly Typed PreviousPage allows direct Access to the public propertIEs of the source page.
通過@Reference指令在目標表單頁中訪問源表單頁
第三種以強類型訪問源表單頁的方法就是在目標表單頁中加入@Reference指令到源目標表單頁的引用,然後通過再PreviousPage屬性來訪問源表單頁。
通過IsCrossPagePostBack屬性來檢測跨頁的提交
當源表單頁跨頁提交到目標表單頁的時候,目標表單頁需要檢索源表單頁,源表單頁就需要在內存中重新加載一次,並且這個過程要經歷除了展現(render)以外的所有頁面周期所要經過的步驟,而這個被重新加載的頁面就是在目標表單頁檢索源表單頁的信息用到的。
源表單頁的IsCrossPagePostBack屬性指明在目標表單頁中使用PerviousPage引用的時候是否重新字內存中被加載。
1. 頁A提交到頁B
2. 頁B訪問PreviousPage:當源表單頁中的IsCrossPostBack的屬性為true時源目標頁就被重新加載一次。
IsCrossPagePostBack屬性可以使其在被目標頁的PreviousPage引用的時候避免不必要的被重新加載一次。
驗證
如果源表單頁有一些驗證控件,源表單頁會在跨頁提交的時候驗證input裡輸入的內容。目標表單頁可以包含一個驗證:PreviousPage.IsValid來捕獲源表單頁裡的非法的提交。
應用的場景
ASP.NET1.1限制只能進行本頁的回調。在ASP.Net2.0中你可以跨頁進行回調到一個不同的表單頁,來實現更多的功能,使代碼結構化並且易於維護。
比如,頁A裡匯集了一些基於web
的報表,並且需要跨頁提交到另一個需要根據前一頁的一些參數產生報表的表單頁。
典型的需要跨頁提交的場合就是當你在同一個表單裡點擊不同的按鈕的時候需要把表單數據提交到不同的表單頁進行處理。目標表單頁被不同的控件所指定,允許把表單的數據提交過去。
當跨應用程序提交的時候,跨頁提交允許提交表單的數據,但是沒有提供源表單頁的空間和vIEwstate的提交。
-------------------------------------
翻譯心得
目前為止翻譯的最別扭的一篇文章,很多都要靠上下文來猜作者的意思,而按照原文照著翻譯下來後,雖然意思是明白,但是怎麼看都不順,所以,用自己的話概括了一下作者的意思。有些話比較長,斷句上可能會有錯誤,請各位朋友批評指正。
學習心得
早先總覺得跨頁提交是十分不被提倡的方法,但是,有的時候可能需求就格路到那裡了,就需要那麼解決,所以多一個方法就多一條路,從中我們還是能看到ASP.NET2.0與ASP.Net1.1的區別。