你可以有你实例化在每个网页,将帮助您处理该顶部的一类。我在下面写了一个例子。 ++请注意,这是未经测试,我只是把它在一起,给你一个想法++:
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