您可以在每个页面的顶部实例化一个类来为您处理这个问题。我在下面写了一个例子。 ++注意这是未经测试的,我只是把它放在一起给你一个想法++:
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 都通过这个类的 ResolveUrl() 方法传递:
myObject.HyperLink = m_QueryStringState.ResolveUrl("~/index/mypage.aspx");
正如我所说,这是未经测试的,因为我现在没有时间确保它完全按预期工作,但只是让您大致了解如何解决这个问题。