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