2010-10-28 77 views
1

有沒有辦法透明地通過網頁傳遞URL參數?我的意思是,當使用重定向時,已經添加的參數將被傳遞到新頁面,而不需要程序員的直接操作。如何透明地將URL參數從頁面傳遞到頁面?

例如:

  1. 我們進入頁面myPage1.aspx參數1 =測試
  2. 執行的Response.Redirect(myPage2.aspx)
  3. 在這裏,我想參數要連接到的URL和在結果:
  4. 頁面重定向到myPage2.aspx參數1 =測試

解決方案應該意識到,用戶可以打開米?而不是共享一個會話的一個應用程序實例(身份驗證)。例如,在一個瀏覽器中打開myPage.aspx?param1 = test,並在第二個瀏覽器中打開mypage.aspx?param1 = test2。

我們在應用程序中已經有一些重定向(Response.Redirect),所以完美的解決方案不應該要求更改現有的代碼。

可以這樣做嗎?

回答

1

可以使用Session對象這樣做的,而不是在查詢字符串複製參數:

// in myPage1.aspx 
Session["url"] = myUrl; 


// in myPage2.aspx 
var passedInUrl = Session["url"]; 

另一種選擇是使用cookies,以類似的方式:

// in myPage1.aspx 
Response.Cookies["url"] = "a url"; 

// in myPage2.aspx 
var passedInUrl = Request.Cookies["url"] 

兩種方式適用於少量數據,但如果您想避免篡改(或能夠發現篡改),則應該加密cookie。

+0

好的。但沒有會話有沒有辦法?對程序員是透明的?我們在應用程序中已經有很少的重定向了,我希望它們保持完整。 – 2010-10-28 09:29:44

+0

@rkrass - 你可以使用cookies。爲什麼你想避免會話?如果您想要在頁面請求之間保留少量數據,那就太好了。 – Oded 2010-10-28 09:31:22

+0

@Oded - 我們希望允許其他Web應用程序將參數傳遞給我們的應用程序。如果參數通過,我不想放鬆它。在一個會話中,用戶可以打開多個瀏覽器窗口,因此我認爲會話參數不能使用。 – 2010-10-28 09:36:07

2

,如果你不想使用會話,只是想使用的查詢字符串參數

  1. 你可以通過你所有的查詢字符串參數這樣

INT LOOP1循環,循環2您可以使用下面;

//加載NameValueCollection對象。

NameValueCollection coll = Request.QueryString;

//獲取所有鍵的名字到一個字符串數組中。 String [] arr1 = coll.AllKeys;

string parameters =「」;

爲(LOOP1 = 0; LOOP1 < arr1.Length; LOOP1 ++){

參數+ = Server.HtmlEncode(ARR1 [LOOP1])+ 「=」 + coll.GetValues(ARR1 [LOOP1]) ;

for(loop2 = 0; loop2 < arr2。長度;循環2 ++){

parameters += Server.HtmlEncode(arr2[loop2]); 

}}

它只是基本思想。但是你可以在不知道名字的情況下遍歷參數。

爲了避免everypage你可以這樣定義一個類編寫代碼

公共類QueryStringHelper { 公共靜態字符串GetQueryString(KeyValuePair查詢字符串) {// 讓你的字符串,並使用上述方法返回的查詢字符串 }}

然後在每一頁上你將不得不在頁面做PREINTI事件

protected override void preinit() 
{ 
     Response.Redirect("redirectpage.aspx" + QueryStringHelper(QueryString)) 
} 

我認爲在everypage上覆制這個事件不會是一個大問題。

AGAIN這個代碼是基本的想法,這不會編譯

+0

是的,但是有沒有一個地方可以放置代碼以避免重寫使用重定向的舊代碼? – 2010-10-28 09:45:29

+0

如果您不想加載頁面並立即將其重定向,則可以使用頁面的PreInit或Init事件來僅設置參數。 但是如果你想在重定向之前做一些事情,那麼首先要做,然後重定向頁面。 最好的辦法是定義一個單獨的類來獲取參數並使用靜態方法(public static string getquerystringparameters())並傳遞查詢字符串對象並獲取參數字符串(「para1 = value1&para2 = valu2」)作爲回報附加到您的重定向頁面。 – zish 2010-10-28 09:59:30

+0

它仍然需要在每個頁面或其父類上添加此代碼。我想避免這種情況。 – 2010-10-28 10:12:39

0

你可以有你實例化在每個網頁,將幫助您處理該頂部的一類。我在下面寫了一個例子。 ++請注意,這是未經測試,我只是把它在一起,給你一個想法++:

public class QueryStringState 
{ 
    private Dictionary<string, string> m_Params = new Dictionary<string, string>(); 
    private System.Web.UI.Page m_Page; 

    // ctor 
    public QueryStringState(System.Web.UI.Page _page, params string[] _persistArgs) 
    { 
     m_Page = _page; 
     foreach (string key in _page.Request.QueryString.Keys) 
     { 
      if (_persistArgs.Contains(key)) // are we persisting this? 
       m_Params[key] = _page.Request.QueryString[key]; 
     }; 
    } // eo ctor 

    // Resolve Url 
    public string ResolveUrl(string _url) 
    { 
     // Resolve the URL appropriately 
     string resolved = m_Page.ResolveUrl(_url); 

     // Add our arguments on to the Url. This assumes that they have NOT been 
     // put on the query string manually. 
     Uri uri = new Uri(resolved); 
     StringBuilder builder = new StringBuilder(uri.Query); 
     if(uri.Query.Length > 0) 
      builder.Append("&"); 
     int counter = 0; 
     foreach(KeyValuePair<string, string> pair in m_Params) 
     { 
      builder.AppendFormat("{0}={1}", pair.Key, pair.Value); 
      ++counter; 
      if(counter < m_Params.Count) 
       builder.Append("&"); 
     }; 

     return(string.Concat(resolved, builder.ToString())); 
    } 
}; 

讓這個類是你的頁面的成員:

private QueryStringState m_QueryStringState = null; 

和初始化過程中實例化,傳遞的任何參數的名稱,你想通過網頁上的查詢字符串堅持:

m_QueryStringState = new QueryStringState(this, "param1", "param2"); 

然後,你必須確保該離開頁面的任何URL都是通過這個CL的RESOLVEURL()方法中傳遞屁股:

myObject.HyperLink = m_QueryStringState.ResolveUrl("~/index/mypage.aspx"); 

正如我所說,這是未經測試,因爲我沒有時間,現在,以確保它的工作原理完全如預期,但給你這是如何解決的總體思路。

相關問題