题
在我的基页中,我需要从查询字符串中删除一个项目并重定向。我不能使用
Request.QueryString.Remove("foo")
因为该集合是只读的。有没有什么方法可以获取查询字符串(除了该一项),而无需迭代集合并重新构建它?
解决方案
您必须重建 url,然后重定向。像这样的东西:
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);
不管怎样,我没有测试这个或任何东西,但它应该有效(或者至少让你朝着正确的方向前进)
其他提示
您可以通过处理原始查询字符串的副本来避免接触原始查询字符串。然后,您可以将页面重定向到包含修改后的查询字符串的网址,如下所示:
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);
Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));
我快速破解,为您节省很少。但是 foo 不会出现在 nextpge.aspx 中等待它的代码:)
有趣的问题。我没有看到任何真正可行的替代方法来手动复制集合,因为 复制到 只允许您获取值(而不是键)。
我认为 HollyStyles 的黑客 会起作用(尽管我会对将替换放入查询字符串中感到紧张 - obv.取决于用例),但有一件事困扰着我..
如果目标页面没有读取它,为什么需要将其从 QueryString 中删除?
只会被忽略吗?
如果做不到这一点,我认为您只需要硬着头皮创建一个 util 方法来为您更改集合。
更新 - 以下OP的回应
啊啊啊!我现在明白了,是的,我在 SiteMap 执行字符串的完整比较时遇到了类似的问题。
自从更改其他源代码(即搜索)是不可能的,我可能会说最好对字符串进行替换。公平地说,如果您经常遇到与此类似的代码,那么设置一个实用程序函数来克隆该集合,并从中过滤一组值,同样可以快速完成。
这样您就再也不用担心此类问题了:)
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);
搜索页面将“&TERM =”附加到查询字符串以突出显示,因此将其弄乱。
唯一的其他选择是正则表达式替换。如果你 确定知道 &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());
这是一个使用 LINQ 的解决方案 Request.QueryString
如果需要,它允许对 qs 参数进行复杂的过滤。
下面的示例显示我过滤掉 uid
param 创建一个准备重定向的相对 URL。
前: 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<string>().Where(k => k != "uid").Select(k => string.Format("{0}={1}", k, rq[k])).ToArray());
var url = string.Concat("~", Request.RawUrl.Split('?')[0], "?", qs);
您可以克隆该集合,然后重定向到包含克隆(和修改)集合的页面吗?
我知道这并不比迭代好多少......