更改单个URL查询字符串值

sta*_*tar 24 asp.net

我有一个ASP.NET页面,它在查询字符串中包含许多参数:

search.aspx?q=123&source=WebSearch
Run Code Online (Sandbox Code Playgroud)

这将显示搜索结果的第一页.现在,在该页面的呈现中,我想显示一组链接,允许用户跳转到搜索结果中的不同页面.我可以简单地通过追加做这个&page=1&page=2

它变得复杂的地方是我想保留原始页面中输入查询字符串的每个参数,除了我正在尝试更改的那个.其他组件使用的url中可能还有其他参数,我尝试替换的值可能已经定义过,也可能没有定义:

search.aspx?q=123&source=WebSearch&page=1&Theme=Blue
Run Code Online (Sandbox Code Playgroud)

在这种情况下,要生成到下一页结果的链接,我想更改page=1为,page=2同时保持查询字符串的其余部分不变.

有没有内置的方法来做到这一点,还是我需要手动完成所有的字符串解析/重组?

Ahm*_*eed 54

您不能直接修改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);
Run Code Online (Sandbox Code Playgroud)

ParseQueryString方法返回一个NameValueCollection(实际上它真的返回一个HttpValueCollection编码结果的,就像我在回答另一个问题时提到的那样).然后,您可以使用该Set方法更新值.您还可以使用该Add方法添加新方法或Remove删除值.最后,调用ToString()名称NameValueCollectionname1=value1&name2=value2querystring 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
Run Code Online (Sandbox Code Playgroud)

您可能需要添加一个using System.Collections.Specialized;以使用NameValueCollection该类.


ann*_*ata 12

你可以做到这一点,而不需要重定向的所有开销(这是不可忽视的).我个人的偏好是使用NameValueCollection,它实际上是一个查询字符串,但使用反射:

// reflect to readonly property 
PropertyInfo isReadOnly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 

// make collection editable 
isReadOnly.SetValue(this.Request.QueryString, false, null); 

// remove 
this.Request.QueryString.Remove("foo"); 

// modify 
this.Request.QueryString.Set("bar", "123"); 

// make collection readonly again 
isReadOnly.SetValue(this.Request.QueryString, true, null); 
Run Code Online (Sandbox Code Playgroud)


Jos*_*ola 5

使用此QueryStringBuilder帮助程序类,您可以获取当前的QueryString并调用该Add方法来更改现有的键/值对...

//before: "?id=123&page=1&sessionId=ABC"
string newQueryString = QueryString.Current.Add("page", "2");
//after: "?id=123&page=2&sessionId=ABC"
Run Code Online (Sandbox Code Playgroud)


Chr*_*ick 0

使用 URIBuilder 特别是链接文本查询属性

我相信这可以满足您的需要。