從一個頁面轉向另一個頁面的請求方式有兩種,Post和Get.
如果從原理上來探究他們的區別,涉及到Http傳輸協議的細節,這樣深究下去,就成華為人乾的事了,有空可以請教一下華為高人,我一個做企業軟體的實在沒那麼多時間也沒必要去研究那些東西,所以就看一下表象吧。
所有的人都知道如下區別:
1.Post傳輸資料時,不需要在URL中顯示出來,而Get方法要在URL中顯示。
2.Post傳輸的資料量大,可以達到2M,而Get方法由於受到URL長度的限制,只能傳遞大約1024位元組.
3.Post顧名思義,就是為了將資料傳送到伺服器段,Get就是為了從伺服器段取得資料.而Get之所以也能傳送資料,只是用來設計告訴伺服器,你到底需要什麼樣的資料.Post的資訊作為http請求的內容,而Get是在Http頭部傳輸的。
我們的form表單的method方法,有兩個,post,get.它在頁面傳值的時候的區別也就是上面提到的三點.
先來看一下post方法.
這個方法在asp時代應該跟程式員打交道很多的,因為那時候沒有現在的ViewState,每個頁面要恢複原來的狀態,都要將頁面Post給自身,然後挨個取值,重新賦值.現在這些瑣碎的事情都讓ViewState代勞了.所以將頁面post給自身的動作,在某種程度上已經被Asp.net的程式員們忘卻了,所以Post也就被大部分的忽視了,這就是技術進步的雙刃劍,帶來方便的同時,蒙上你的眼睛。
ViewState必須包含在<form runat="server">的表單下,而只要包含了"runat="server""的標誌,就甭想Post到其他頁面中去,為什麼?老蓋說,我的ViewState是儲存當前頁面狀態的,你要轉到其他頁面,他說,不行,**不認識的參數.如果想Post一個表單,咋辦?有四種方式可供選擇.
1.在頁面上建立一個form,不要加上runat="server"的標誌,當然在這個表單下的控制項也就不用想用Viewstate來傳值了.當在其他有runat="server"的表單的中的按鈕事件中,手動調用建立form的submit() 函數.
傳送頁面代碼如下:
<!--html代碼-->
<form id="Form1" method="post" runat="server">
<input id="btnTransfer" type="button" onclick="post();" runat="server">
<input type="text" runat="server" id="SourceData">
</form>
<form id="forPost" method="post">
<input type="text" runat="server" id="SourceData2">
</form>
<!--Script代碼-->
<script language="javascript">
function post()
{
forPost.action="DestinationPage.aspx";
forPost.submit();
}
</script>
接收頁面
string a=Request.Form["SourceData2"].ToString();
2.通過Session取值,在一個頁面中賦值,在其他頁面中共用,這個方式也被廣泛應用,個人不傾向於用這種方式,我怕造成Session值的混亂無序,Session用來存一些公用的東西已經累得夠嗆了。
3.通過Context傳值,在傳送頁面之前,將需要傳遞到其他頁面的值存在Context中。範例程式碼如下:
傳送頁面
//點擊某個button時觸發
private void btnTransfer_ServerClick(object sender, EventArgs e)
{
Context.Items["SourceData"]=SourceData.Value;
Server.Transfer("DestinationPage.aspx");
}
接收頁面
string a=Context.Items["SourceData"].ToString();
4.通過Server.Transfer的方式。
這個方式在方法三種已經用到了,不過可以在調用頁面為要傳遞到被調用頁面的值建立屬性(當然可以直接將它設成public),這樣就可以在其他頁面訪問了。
傳送頁面
//要傳送的值
private
System.Web.UI.HtmlControls.HtmlInputText SourceData;
public string getSourceData
{
get
{
return SourceData.Value;
}
}
//傳送頁面
Server.Transfer("DestinationPage.aspx");
接收頁面
private SourceClass sourcePage;
sourcePage=(SourceClass)Context.Handler;
string aa=sourcePage.getSourceData;
以上就是Post的在不同頁面傳遞資料的方式了。
下面是get方法
我常用的是 傳送頁面
string aa=SourceData.Value;
string bb=SourceData.Value;
string url="DestinationPage.aspx?parameter1="+aa+"¶meter2="+bb;
Response.Redirect(url,false);
接收頁面
string aa=Request.QueryString["parameter1"].ToString();
string bb=Request.QueryString["parameter2"].ToString();
至於 Response.Redirect(url,false)裡的false都是Response.End()這個方法惹的禍,老蓋說,寫成false就好了,因為預設是true。我都轉向其他頁面了,還不讓我終止原來頁面的響應
來自: http://hi.baidu.com/boomyear/blog/item/2f82c8100a60fbf1c3ce79ed.html