你可以有你實例化在每個網頁,將幫助您處理該頂部的一類。我在下面寫了一個例子。 ++請注意,這是未經測試,我只是把它在一起,給你一個想法++:
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");
正如我所說,這是未經測試,因爲我沒有時間,現在,以確保它的工作原理完全如預期,但給你這是如何解決的總體思路。
好的。但沒有會話有沒有辦法?對程序員是透明的?我們在應用程序中已經有很少的重定向了,我希望它們保持完整。 – 2010-10-28 09:29:44
@rkrass - 你可以使用cookies。爲什麼你想避免會話?如果您想要在頁面請求之間保留少量數據,那就太好了。 – Oded 2010-10-28 09:31:22
@Oded - 我們希望允許其他Web應用程序將參數傳遞給我們的應用程序。如果參數通過,我不想放鬆它。在一個會話中,用戶可以打開多個瀏覽器窗口,因此我認爲會話參數不能使用。 – 2010-10-28 09:36:07