我有一个ASP.NET页面,它在查询字符串中需要一些参数:
search.aspx?q=123&source=WebSearch
这将显示搜索结果的第一页。现在在该页面的呈现中,我想显示一组链接,允许用户跳转到搜索结果中的不同页面。我可以通过追加& page = 1或& page = 2等来做到这一点。
它变得复杂的是,我想保留原始页面中的输入查询字符串,除了我想要更改的每个参数。在其他组件使用的url中可能还有其他参数,我试图替换的值可能已经被定义了,也可能不会被定义:
search.aspx?q=123&source=WebSearch&page=1&Theme=Blue
在这种情况下,要生成到下一页结果的链接,我想将page = 1更改为page = 2,而其余的查询字符串不变。
有没有内建的方法来做到这一点,还是需要手动执行所有的字符串解析/重组?
解决方法
您不能直接修改
QueryString,因为它是唯读的。您将需要获取值,修改它们,然后将它们放在一起。尝试这个:
var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString()); nameValues.Set("page","2"); string url = Request.Url.AbsolutePath; string updatedQueryString = "?" + nameValues.ToString(); Response.Redirect(url + updatedQueryString);
ParseQueryString
method返回一个NameValueCollection
(实际上它真的返回一个编码结果的HttpValueCollection,as I mention in an answer to another question)。然后可以使用Set方法来更新值。您还可以使用Add方法添加新的方法,或者使用Remove删除一个值。最后,调用NameValueCollection上的ToString()返回name1 = value1& name2 = value2 querystring ready格式中的名称值对。一旦你把它附加到URL并重定向。
nameValues["temp"] = "hello!"; // add "temp" if it didn't exist nameValues["temp"] = "hello,world!"; // overwrite "temp" nameValues.Remove("temp"); // can't remove via indexer
您可能需要添加一个使用System.Collections.Specialized;以使用NameValueCollection类。