如何从查询字符串中删除项目以进行重定向?
在我的基页中,我需要从查询字符串中删除一个项目并重定向。 我不能用
Request.QueryString.Remove("foo")
因为该集合是只读的。 有没有办法获取查询字符串(除了那一项)而不迭代整个集合并重新构建它?
您必须重建url然后重定向。 像这样的东西:
string url = Request.RawUrl; NameValueCollection params = Request.QueryString; for (int i=0; i
无论如何,我没有测试那个或任何东西,但它应该工作(或至少让你在正确的方向)
您可以通过处理原始查询字符串来避免触及原始查询字符串。 然后,您可以将页面重定向到包含已修改查询字符串的URL,如下所示:
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);
更新:
事实certificate我们可以像这样简化代码:
var nvc = HttpUtility.ParseQueryString(Request.Url.Query); nvc.Remove("foo"); string url = Request.Url.AbsolutePath + "?" + nvc.ToString(); Response.Redirect(url);
Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));
我快速破解,拯救你一点点。 但是foo将不会出现在nextpge.aspx中等待它的代码:)
有趣的问题。 我没有看到任何真正可行的替代手动复制集合,因为CopyTo只允许你获取值(而不是键)。
我认为HollyStyles的Hack会起作用(虽然我会担心将一个替换放在一个QueryString中 – 依赖于用例),但是有一件事让我感到烦恼。
如果目标页面没有读取它,为什么需要从QueryString中删除它?
它会被忽略吗?
如果做不到这一点,我认为你只需要咬紧牙关并创建一个util方法来为你改变collections。
更新 – 遵循OP的回应
哈啊! 我现在看到了,是的,我遇到了与SiteMap执行字符串完全比较的类似问题。
由于更改其他源代码(即搜索)是不可能的,我可能会说最好对字符串执行替换。 虽然公平地说,如果您经常遇到类似于此的代码,那么设置实用程序函数以克隆集合同样快速,从中过滤一系列值。
这样你再也不用担心这样的问题了:)
HttpUtility.ParseQueryString(Request.Url.Query)
返回的是QueryStringValueCollection
。 它inheritance自NameValueCollection
。
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);
搜索页面将“&terms =”附加到查询字符串以突出显示,因此会将其混乱。
只有其他选项是正则表达式替换。 如果你肯定知道&terms是在集合的中间某处留下尾随&在正则表达式中,如果你确定它在最后然后删除尾随&并将替换字符串“&”更改为String.Empty
Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));
Request.Url.GetLeftPart(UriPartial.Path)
应该这样做
我发现这是一个更优雅的解决方案
var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString()); qs.Remove("item"); Console.WriteLine(qs.ToString());
这是一个针对Request.QueryString
使用LINQ的解决方案,它允许在需要时对qs参数进行复杂的过滤。
下面的示例显示我过滤掉uid
参数以创建准备重定向的相对URL。
之前: http://www.domain.com/home.aspx?color=red&uid=1&name=bob
: http://www.domain.com/home.aspx?color=red&uid=1&name=bob
red& http://www.domain.com/home.aspx?color=red&uid=1&name=bob
name = http://www.domain.com/home.aspx?color=red&uid=1&name=bob
之后: ~/home.aspx?color=red&name=bob
从url中删除QS参数
var rq = this.Request.QueryString; var qs = string.Join("&", rq.Cast().Where(k => k != "uid").Select(k => string.Format("{0}={1}", k, rq[k])).ToArray()); var url = string.Concat("~", Request.RawUrl.Split('?')[0], "?", qs);
您可以克隆该集合,然后重定向到包含克隆(和修改)集合的页面吗?
我知道这比迭代好多了……