2013-02-19 18 views
25

我正在嘗試改進我的Web門戶的性能。我使用Session來存儲狀態信息。如何在不使用會話的情況下跨ASP.net中的頁面傳遞值

但我聽說使用會話會降低應用程序的速度。是否有任何其他方式在asp.net中通過頁面傳遞值。

+0

你試過緩存嗎? – ssilas777 2013-02-19 11:16:16

+0

使用'session'並不壞,但使用會話可能有一些因素。用戶數量。你的帶寬。切斷容量。如果你有上述提及,你可以使用'session'。 – 2013-02-19 11:19:52

+0

@ ssilas777對於所有的用戶來說,通常「緩存」是相同的。所以在他的情況下,他不能使用緩存。 – 2013-02-19 11:20:51

回答

51

您可以從一個頁面值傳遞給另一個通過如下..

Response.Redirect 
Cookies 
Application Variables 
HttpContext 

的Response.Redirect

SET:

Response.Redirect("Defaultaspx?Name=Pandian"); 

GET:

string Name = Request.QueryString["Name"]; 

餅乾

SET:

HttpCookie cookName = new HttpCookie("Name"); 
cookName.Value = "Pandian"; 

GET:

string name = Request.Cookies["Name"].Value; 

應用程序變量

SET:

Application["Name"] = "pandian"; 

GET:

string Name = Application["Name"].ToString(); 

這裏參考的全部內容:Pass values from one to another

+6

'-1'和應用程序。特別是如果您使用webgarden或webfarm,應用程序無法工作!而應用程序變量是一個簡單的Dictionary <>,它只存在於與舊的asp兼容並且不被使用。此外,Cookie不適用於像這樣的頁面之間傳輸數據。非常糟糕的設計,不是很好的做法。 – Aristos 2013-02-19 13:03:56

+0

@Aristos,當數據被(作爲)存儲爲cookie時,-1是否適用?如果每個頁面都必須從cookie中檢索數據並將修改後的值存儲到cookie中,那麼在其他位置存儲數據時是否有任何價值**還有**? – user34660 2016-03-29 23:44:44

+1

@ user34660我不理解你... – Aristos 2016-03-30 08:38:24

22

有多種方法可以實現這一點。我可以簡要地向您解釋我們在日常編程生命週期中使用的4種類型。

請仔細閱讀以下幾點。

1查詢字符串。

FirstForm.aspx.cs

Response.Redirect("SecondForm.aspx?Parameter=" + TextBox1.Text); 

SecondForm.aspx.cs

TextBox1.Text = Request.QueryString["Parameter"].ToString(); 

這是你逝去的整數樣的價值或其他短的最可靠的方法參數。如果在傳遞查詢字符串時使用該值中的任何特殊字符,則此方法的更多優勢:必須在將值傳遞到下一頁之前對其進行編碼。因此,我們的代碼段將是這樣的:

FirstForm.aspx.cs

Response.Redirect("SecondForm.aspx?Parameter=" + Server.UrlEncode(TextBox1.Text)); 

SecondForm.aspx.cs

TextBox1.Text = Server.UrlDecode(Request.QueryString["Parameter"].ToString()); 

URL編碼

  1. Server.URLEncode
  2. HttpServerUtility.UrlDecode

2.通過上下文對象

通過上下文對象傳遞值另一廣泛使用的方法傳值。

FirstForm.aspx.cs

TextBox1.Text = this.Context.Items["Parameter"].ToString(); 

SecondForm.aspx.cs

注意,我們導航到使用的Server.Transfer代替Response.Redirect的另一頁。我們中的一些人也使用Session對象來傳遞值。在該方法中,值存儲在Session對象中,然後在第二頁中從Session對象中取出。

3。將表單發送到另一個頁面而不是回發

通過將頁面發佈到另一個表單來傳遞價值的第三種方法。這裏是一個例子:

FirstForm.aspx.cs

private void Page_Load(object sender, System.EventArgs e) 
{ 
    buttonSubmit.Attributes.Add("onclick", "return PostPage();"); 
} 

我們創建一個JavaScript函數發佈形式。

SecondForm.aspx.cs

function PostPage() 
{ 
    document.Form1.action = "SecondForm.aspx"; 
    document.Form1.method = "POST"; 
    document.Form1.submit(); 
} 
TextBox1.Text = Request.Form["TextBox1"].ToString(); 

在這裏,我們發佈表單到另一個頁面,而不是自己。使用此方法可能會在第二頁中看到viewstate無效或錯誤。爲了解決這個錯誤是由添加PostBackUrl屬性把EnableViewStateMac=false

4.另一種方法是通過增加控制的PostBackUrl屬性跨頁回發

在ASP.NET 2.0中,微軟已經解決了這個問題控制跨頁面回發。實施是一個設定控制權的問題,你已經完成了。

FirstForm.aspx.cs

<asp:Button id=buttonPassValue style=」Z-INDEX: 102″ runat=」server」 Text=」Button」   PostBackUrl=」~/SecondForm.aspx」></asp:Button> 

SecondForm.aspx.cs

TextBox1.Text = Request.Form["TextBox1"].ToString(); 

在上述例子中,我們分配按鈕的PostBackUrl屬性,我們可以在網頁確定它將發佈而不是自己。在下一頁中,我們可以使用Request對象訪問前一頁的所有控件。

您也可以使用PreviousPage類來訪問上一頁的控件,而不是使用傳統的Request對象。

SecondForm.aspx

TextBox textBoxTemp = (TextBox) PreviousPage.FindControl(「TextBox1″); 
TextBox1.Text = textBoxTemp.Text; 

正如你已經注意到了,這也是一個簡單,乾淨實現頁面之間傳遞的價值。

參考:MICROSOFT MSDN WEBSITE

編碼快樂!

+1

任何投票原因? – 2015-02-11 04:07:43

+0

我不知道如何寫你的名字,但感謝你的信息。我在Master.Page中有一個方法,它將User對象設置爲Session變量。在繼承Master.Page的登錄頁面上登錄後,他們可以使用也從Master.Page繼承的聯繫頁面發送電子郵件。但是,在聯繫人頁面的Page_Load事件中,User對象爲null。我不知道爲什麼。 – jp2code 2016-04-29 14:27:34

1

您可以將其分配到一個隱藏字段,並使用

var value= Request.Form["value"] 
3

如果它只是在頁面之間傳遞值讀取出來,然後你只需要它的一個請求。使用Context.

語境

上下文對象保持數據爲單個用戶,用於單個 請求,並且僅持續了所述請求的持續時間。上下文容器可容納大量數據,但通常用於保存小塊數據,因爲它通常通過global.asax中的處理程序對每個請求實施 。上下文 容器(可從頁面對象訪問或使用 System.Web.HttpContext.Current)提供用於保存需要在不同HttpModules和HttpHandlers之間傳遞 的值。它也可以用於保存與整個 請求相關的信息。例如,IBuySpy門戶在Global.asax的Application_BeginRequest 事件處理程序期間將一些配置 信息填充到此容器中。請注意,這僅適用於當前請求的 ;如果您需要的東西仍然在 的下一個請求中,請考慮使用ViewState。設置並獲取來自Context集合的數據 使用的語法與 已與其他集合對象(如應用程序, 會話和高速緩存)已見過的語法相同。兩個簡單的例子如下所示:

// Add item to 
Context Context.Items["myKey"] = myValue; 

// Read an item from the 
Context Response.Write(Context["myKey"]); 

http://msdn.microsoft.com/en-us/magazine/cc300437.aspx#S6

使用以上。如果您接着執行Server.Transfer,則上下文中保存的數據現在可用於下一頁。您不必關心刪除/整理這些數據,因爲它僅限於當前的請求。

+0

對不起,我應該更加明確。答案現在已經更新。 – 2013-02-19 12:50:58

+0

是的,好吧,當你使Server.Transfer它的作品。用於Cookie的 – Aristos 2013-02-19 12:52:37

1

您可以使用查詢字符串從一個頁面傳遞值到另一個..

1。通過使用查詢字符串

Response.Redirect("Default3.aspx?value=" + txt.Text + "& number="+n); 

2.Retrive在ü要通過使用任何這些方法的頁面值的價值..

方法一

string v = Request.QueryString["value"]; 
    string n=Request.QueryString["number"]; 

方法2

 NameValueCollection v = Request.QueryString; 
    if (v.HasKeys()) 
    { 
     string k = v.GetKey(0); 
     string n = v.Get(0); 
     if (k == "value") 
     { 
      lbltext.Text = n.ToString(); 
     } 
     if (k == "value1") 
     { 
      lbltext.Text = "error occured"; 
     } 
    } 

注意:方法2是最快的方法。

相關問題