在我的基本页面中,我需要从查询字符串中删除一个项目并进行重定向。 我不能用
1
| Request.QueryString.Remove("foo") |
因为该集合是只读的。 有什么方法可以获取查询字符串(除了一项以外),而无需遍历集合并重新构建它?
您可以通过处理原始查询字符串的副本来避免触摸原始查询字符串。然后,您可以将页面重定向到包含修改后的查询字符串的url,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12
| var nvc = new NameValueCollection();
nvc.Add(HttpUtility.ParseQueryString(Request.Url.Query));
nvc.Remove("foo");
string url = Request.Url.AbsolutePath;
for (int i = 0; i < nvc.Count; i++)
url += string.Format("{0}{1}={2}", (i == 0 ?"?" :"&"), nvc.Keys[i], nvc[i]);
Response.Redirect(url); |
更新:
事实证明,我们可以像这样简化代码:
1 2 3 4 5 6 7
| var nvc = HttpUtility.ParseQueryString(Request.Url.Query);
nvc.Remove("foo");
string url = Request.Url.AbsolutePath +"?" + nvc.ToString();
Response.Redirect(url); |
您必须重建网址,然后重定向。像这样:
1 2 3 4 5 6 7 8 9 10 11
| string url = Request.RawUrl;
NameValueCollection params = Request.QueryString;
for (int i=0; i<params.Count; i++)
{
if (params[i].GetKey(i).ToLower() =="foo")
{
url += string.Concat((i==0 ?"?" :"&"), params[i].GetKey(i),"=", params.Get(i));
}
}
Response.Redirect(url); |
无论如何,我没有进行任何测试,但是它应该可以工作(或者至少可以使您朝正确的方向前进)
HttpUtility.ParseQueryString(Request.Url.Query)返回为QueryStringValueCollection。它是从NameValueCollection继承的。
1 2 3 4 5 6 7 8
| var qs = HttpUtility.ParseQueryString(Request.Url.Query);
qs.Remove("foo");
string url ="~/Default.aspx";
if (qs.Count > 0)
url = url +"?" + qs.ToString();
Response.Redirect(url); |
有趣的问题。我看不到任何真正可行的替代方法来手动复制集合,因为CopyTo仅允许您获取值(而不是键)。
我认为HollyStyles的Hack可以工作(尽管我很担心将Replace放在QueryString中-视情况而定),但是有一件事情困扰我。
如果目标页面没有读取它,为什么需要将其从QueryString中删除?
会被忽略吗?
失败了,我想您只需要硬着头皮,创建一个util方法即可为您更改收藏。
更新-OP的回应
啊!我现在知道了,是的,SiteMap执行字符串的完全比较时遇到了类似的问题。
由于更改其他源代码(即搜索)是不可能的,所以我可能会说最好对字符串进行替换。公平地说,如果您经常遇到与此类似的代码,则设置一个实用程序函数来克隆集合,并从数组中筛选出一组值,将同样快。
这样,您就不必再担心此类问题了:)
1
| Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo","mangledfoo"))); |
我很快就破解了,为您节省了很少。但是foo在nextpge.aspx中不会显示等待代码的代码:)
这是一个针对Request.QueryString使用LINQ的解决方案,如果需要,它可以对qs参数进行复杂的过滤。
下面的示例向我展示了过滤uid参数以创建准备重定向的相对URL。
之前:http://www.domain.com/home.aspx?color=red&uid=1&name=bob
之后:~/home.aspx?color=red&name=bob
从网址中删除QS参数
1 2 3
| var rq = this.Request.QueryString;
var qs = string.Join("&", rq.Cast<string>().Where(k => k !="uid").Select(k => string.Format("{0}={1}", k, rq[k])).ToArray());
var url = string.Concat("~", Request.RawUrl.Split('?')[0],"?", qs); |
我发现这是一个更优雅的解决方案
1 2 3
| var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString()); |
Request.Url.GetLeftPart(UriPartial.Path)应该这样做
The search page appends"&terms=" to the query string for highlighting, so
it messes it up.
唯一的其他选择是正则表达式替换。如果您确定&terms位于集合的中间,则将尾部的&放在正则表达式中,如果您确定其末尾,则删除尾部的&并将替换字符串"&"更改为String.Empty。
1
| Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(),"&terms=.*&","&")); |
您可以克隆集合,然后重定向到包含克隆的(和修改的)集合的页面吗?
我知道这并不比迭代好多少...