小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ASP.NET 2.0中實現(xiàn)跨頁面提交

 悟靜 2012-12-31

ASP.NET 2.0中實現(xiàn)跨頁面提交

ASP.NET 2.0中實現(xiàn)跨頁面提交


在ASP.NET 1.X 版本中,頁面都是提交到自己本身,并不能方便的指定需要提交的目的頁面。例如FirstPage.aspx中的button只能提交到FirstPage.aspx,而不能提交到SecondPage.aspx。很多時候,ASP.NET 1.X這樣工作方式使我們的開發(fā)方式受到不少限制。熟悉ASP/JSP/PHP的朋友大概很不習(xí)慣,因為以前經(jīng)常使用的提交方式突然無法使用,雖然也有解決這個問題的方法(演示W(wǎng)ebcast),可是過程太煩瑣,不甚方便。令我們高興的是,ASP.NET 2.0中有了跨頁面提交的簡單方法。

  簡單的例子

  首先看看下面的代碼,F(xiàn)irstPage.aspx中的Button通過指定PostBackUrl屬性可以提交到指定的頁面:

  FirstPage.aspx


<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public String UserName {
 get {
  return this.txtName.Text;
 }
}
protected void Button1_Click(object sender, EventArgs e)
{
 Label1.Text = "Postback from self. Your Name is: " + txtName.Text;
}
</script>

<html xmlns="http://www./1999/xhtml" >
<head runat="server">
?。糾eta content="text/JScript" http-equiv="content-script-type" />
?。紅itle>First Page</title>
</head>
<body>
?。糵orm id="form1" runat="server">
 <div>
 ?。糷3>The Frist Page</h3>
  Your Name:
  <asp:TextBox ID="txtName" runat="server" />
 ?。糰sp:Label ID="Label1" runat="server" EnableViewState="False" /><br />
  <br />
 ?。糰sp:Button ID="Button1" runat="server" Text="Postback to Same Page" OnClick="Button1_Click" /><br />
  <br />
 ?。糰sp:Button ID="Button2" runat="server" Text="Postback to Second Page" PostBackUrl="~/SecondPage.aspx" /><br />
 </div>
</form>
</body>
</html>

  SecondPage.aspx


<%@ Page Language="C#" %>
<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
 this.Label1.Text = "Your Name is : " + PreviousPage.UserName;
}
</script>

<html xmlns="http://www./1999/xhtml" >
<head runat="server">
<title>Second Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>This is the Second Page</h1>
<p><asp:Label ID="Label1" runat="server"></asp:Label> </p>
</div>
</form>
</body>
</html>

  打開FirstPage.aspx,輸入內(nèi)容并按下"Postback to Second Page"按鈕提交,頁面就會提交到SecondPage.aspx,輸入的內(nèi)容也會顯示在SecondPage.aspx上。注意FirstPage.aspx中Button2新增的PostBackUrl屬性,還有SecondPage.aspx中的@PreviousPageType指令。這些新增的內(nèi)容,正是ASP.NET 2.0 中的跨頁提交的方案的組成部分。

  大家可能會發(fā)現(xiàn),在使用ASP.NET 2.0 的跨頁面提交功能的時候,目標(biāo)頁面都是在源頁面的窗口中打開的。但有時候我們需要在新的窗口中打開目標(biāo)頁面,通過修改源頁面中<form>的屬性可以實現(xiàn)這一點。如下面的代碼所示:


<form id="MainForm" Target="_blank" runat="server">

  讀取源頁面的信息

  ASP.NET 2.0中,Button控件有個新增的屬性PostBackUrl,用來設(shè)置需要提交的目標(biāo)頁面。因為只要指定Button控件的PostBackUrl屬性就可以提交到其它頁面,我們可以在頁面中使用多個控件配置其PostBackUrl的屬性,提交到不同的頁面。當(dāng)然也可配置多個頁面提交到同一個頁面。

  在跨頁面提交之后,通常我們需要從源頁面中讀取控件的信息(即由瀏覽器發(fā)送的信息),以及源頁面的公共屬性。

  讀取控件的值

  ASP.NET 2.0的Page類新增了一個PreviousPage屬性。顧名思義,目標(biāo)頁面中的這個屬性包含對源頁面的引用。這樣就可以在目標(biāo)頁面中通過PreviousPage屬性訪問源頁面的信息,我們一般使用FindControl方法來查找源頁面上的控件并讀取這些控件的值。下面的代碼說明了該方法的使用:


if (Page.PreviousPage != null)
{
 TextBox txtName = (TextBox)Page.PreviousPage.FindControl("txtName");
 if (txtName != null)
 {
  Label1.Text = txtName.Text;
 }
}

  當(dāng)我們想查找源頁面中控件屬于另一個控件或者是模板之中,就不能直接使用FindControl方法來讀取它,而是應(yīng)該先獲取對該容器的引用,然后才能在該容器中查找要獲取的控件。下面的例子中,F(xiàn)irstPage.aspx頁面中包含一個Panel控件,其ID為MainPanel,它還包含ID為UserName的TextBox控件。具體代碼如下:


Panel MainPanel = (Panel)PreviousPage.FindControl("MainPanel");
if (MainPanel != null)
{
 TextBox UserName = (TextBox)MainPanel.FindControl("UserName");
 if (UserName != null)
 {
  Label1.Text = UserName.Text;
 }
}
else
{
 Label1.Text = "Cannot find UserName control.";
}

  讀取源頁面的公共屬性

  一旦在目標(biāo)頁面中獲取了PreviousPage的引用,就能訪問源頁面中公共控件的屬性,同樣也可訪問源頁面中的公共屬性。當(dāng)然,我們需要預(yù)先在源頁面中公開需要被訪問的屬性方可在目標(biāo)頁面中訪問。

  若要獲取源頁面的公共成員,必須先獲取對源頁面的強類型引用。就像第一個例子中,我們可以使用@PreviousPageType指令來指定源頁面,它有兩個屬性分別為:VirtualPath和TypeName。使用VirtualPath屬性指定來源頁的虛擬路徑(包含文件名),也可以使用TypeName指定源頁面的屬性。注意只能指定其中的一個,兩者都指定就會失效。如第一個例子中所示:


<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>

  如果使用了@PreviousPageType指令,目標(biāo)頁面中的PreviousPage 屬性被強類型化為源頁面的類。因此,可以直接引用源頁面的公共成員。要獲取對源頁面的強類型引用的另一種方法是在目標(biāo)頁面中包含一個@Reference 指令,就像引用要在頁面中使用的其它任何類型一樣。在這種情況下,你可以在目標(biāo)頁面中獲取目標(biāo)頁面的PreviousPage屬性并將其強制轉(zhuǎn)換為源頁面的類型,如下面的代碼所示:


SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.UserName;

  讀取源頁面中的Form信息

  如果源頁面和目標(biāo)頁面屬于同一個 ASP.NET 應(yīng)用程序,則目標(biāo)頁中的PreviousPage屬性包含對源頁面的引用。在沒有使用@PreviousPageType指令的情況下,目標(biāo)頁面中PreviousPage 屬性類型化為Page。

  注意,如果該頁不是跨頁發(fā)送的目標(biāo)頁面或者目標(biāo)頁面位于不同的應(yīng)用程序中,則不會初始化PreviousPage屬性。

  如果源頁面和目標(biāo)頁面屬于不同的應(yīng)用程序,甚至是不同的網(wǎng)站,那就無法直接獲取源頁面上控件的值,但可以從Request.Form中讀取發(fā)送的數(shù)據(jù)。還有一個需要注意的問題,因為源頁面的視圖狀態(tài)經(jīng)過Hash處理,所以不能從源頁面中讀取視圖狀態(tài)。如果要在源頁面中存儲值并讓這些值可供其他應(yīng)用程序中的目標(biāo)頁使用,可以將這些值作為字符串存儲在源頁面的隱藏字段中,并在目標(biāo)頁面中通過 Request.Form 來訪問它們。

  判斷是否為跨頁面提交

  跨頁面提交的時候,源頁面控件的內(nèi)容被提交到目標(biāo)頁面,然后瀏覽器執(zhí)行POST操作(注意,不是GET)。在ASP.NET 1.x中由于頁面都是自己提交給自己,可以通過Page的IsPostBack屬性來判斷是否為頁面提交。但是在跨頁面提交的時候,目標(biāo)頁面的IsPostBack屬性為false。如果要判斷是否為跨頁面提交,可以對目標(biāo)頁面的PreviousPage屬性返回的引用頁面的IsCrossPagePostBack屬性進(jìn)行判斷,如下面的代碼所示:


if(PreviousPage != null)
{
 if(PreviousPage.IsCrossPagePostBack == true)
 {
  Label1.Text = "跨頁面提交";
 }
}
else
{
 Label1.Text = "非跨頁面提交";
}

  注意,如果當(dāng)前頁面不是跨頁面提交的目標(biāo)頁面,則其PreviousPage屬性為空。

  跨頁面提交 VS Server.Transfer

  ASP.NET 2.0中,無論是跨頁面提交還是使用Server.Transfer操作,都可以使用Previousoage屬性來獲取對源頁面的引用。如果要區(qū)分它們,可以使用上面介紹的方法。

  下面是跨頁面提交與Server.Transfer之間的一些區(qū)別:


屬 性              跨頁面提交    Server.Transfer
IsPostBack            false        false
PreviousPage           源頁面的引用  源頁面的引用
PreviousPage.IsCrossPagePostBack  true         false
IsCrossPagePostBack        false         false
IsCallBack             false         false

  跨頁面提交是客戶端瀏覽器的行為,而Server.Transfer則是服務(wù)器端的行為。在后面的小節(jié)中,我們會分析跨頁面提交時客戶端瀏覽器是如何實現(xiàn)提交的。

  對跨頁面提交的簡單分析

  在上面的例子中,我們都提到設(shè)置Button的PostBackUrl屬性來實現(xiàn)跨頁面提交。其實只要實現(xiàn)IButtonControl接口的控件均可以實現(xiàn)這一點。Button, ImageButton, 和 LinkButton都實現(xiàn)了IButtonControl接口。通過實現(xiàn)IButtonControl,自定義控件也可以有表單中的按鈕所具有的跨頁面提交的功能。IButtonControl接口聚合了ASP.NET 1.x支持的多數(shù)按鈕控件(包括一些html按鈕控件)的一些屬性。

  當(dāng)設(shè)置了Button控件的PostBackUrl屬性之后,ASP.NET運行時將為按鈕控件的所對應(yīng)的的html元素綁定一段新的JavaScript代碼。使用新的 WebForm_DoPostBackWithOptions函數(shù)取代常規(guī)以前所使用的__doPostback函數(shù)。具體的HTML代碼示例如下:


<input type="submit" name="Button2" value="Postback to Second Page" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("Button2", "", false, "", "SecondPage.aspx", false, false))" id="Button2" />

  上述代碼中的WebForm_DoPostBackWithOptions函數(shù)與WebForm_PostBackOptions函數(shù)的javascript代碼如下:


function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {
this.eventTarget = eventTarget;
this.eventArgument = eventArgument;
this.validation = validation;
this.validationGroup = validationGroup;
this.actionUrl = actionUrl;
this.trackFocus = trackFocus;
this.clientSubmit = clientSubmit;
}

function WebForm_DoPostBackWithOptions(options) {
var validationResult = true;
if (options.validation) {
if (typeof(Page_ClientValidate) == 'function') {
validationResult = Page_ClientValidate(options.validationGroup);
}
}
if (validationResult) {
if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {
theForm.action = options.actionUrl;
}
if (options.trackFocus) {
var lastFocus = theForm.elements["__LASTFOCUS"];
if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {
if (typeof(document.activeElement) == "undefined") {
lastFocus.value = options.eventTarget;
}
else {
var active = document.activeElement;
if ((typeof(active) != "undefined") && (active != null)) {
if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {
lastFocus.value = active.id;
}
else if (typeof(active.name) != "undefined") {
lastFocus.value = active.name;
}
}
}
}
}
}
if (options.clientSubmit) {
__doPostBack(options.eventTarget, options.eventArgument);
}
}

  用戶點擊按鈕時,當(dāng)前表單將內(nèi)容提交給PostPageUrl屬性所指定的目標(biāo)頁面。當(dāng)頁面中含有可以實現(xiàn)跨頁面提交功能的控件時,頁面會創(chuàng)建一個name為__PREVIOUSPAGE的隱藏字段,此字段包含了源頁面的信息。目標(biāo)頁面則使用此信息來創(chuàng)建一個完整狀態(tài)的引用來調(diào)用源頁面對象。上述隱藏字段的相關(guān)HTML代碼示例如下:


<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="ND3_1GqjDSUeAC3yLYVz-eQrkTzZLYFHliIFf7mMQVBdmwZmFi8HG4mzX5pfZY0n0" />

  總 結(jié)

  ASP.NET 2.0 新增的跨頁面提交功能,讓我們的開發(fā)過程有了更加靈活的選擇。在使用跨頁面提交的時候,我們要根據(jù)實際的情況選擇合適的方式來讀取源頁面中的信息。如果源頁面與目標(biāo)頁面處于同一個應(yīng)用程序之內(nèi),我們可以選擇使用@PreviousPageType指令來指定源頁面,這樣就可以使用強類型引用的好處。

  由于ASP.NET中的每個頁面類所包含的子控件對應(yīng)的是protected成員,所以您不能直接通過PreviousPage引用來訪問源頁面中的控件,而先需要將源頁面中需要被訪問的屬性公開出來。同時,建議您只將需要的信息作為公共屬性公開,以減少可能被潛在的惡意用戶使用的信息。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多