关于c#:如何从查询字符串中删除项目以进行重定向?

关于c#:如何从查询字符串中删除项目以进行重定向?

How do I remove items from the query string for redirection?

在我的基本页面中,我需要从查询字符串中删除一个项目并进行重定向。 我不能用

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=.*&","&"));

您可以克隆集合,然后重定向到包含克隆的(和修改的)集合的页面吗?

我知道这并不比迭代好多少...


推荐阅读

    linux线程查询命令?

    linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Lin

    linux查询网关命令?

    linux查询网关命令?,网络,信息,地址,环境,系统,网关,名字,中心,状态,命令,lin

    linux拼接字符串命令?

    linux拼接字符串命令?,系统,工作,代码,工具,名称,信息,地址,时间,数据,命令,l

    linux命令查询参数?

    linux命令查询参数?,网络,信息,设备,系统,服务,状态,情况,工作,地址,命令,Lin

    linux查询硬盘命令行?

    linux查询硬盘命令行?,情况,系统,信息,工具,单位,软件,命令,服务,电脑,分析,

    添加字符串命令linux?

    添加字符串命令linux?,情况,名称,文件,位置,名字,地方,连续,信息,命令,内容,L

    linux命令创建项目组?

    linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文

    linux查询分辨率命令?

    linux查询分辨率命令?,情况,设备,系统,分辨率,数据,命令,屏幕,屏幕分辨率,

    linux常用命令查询?

    linux常用命令查询?,工作,地址,系统,信息,命令,目录,管理,标准,常用命令,控

    linux命令查询汉语?

    linux命令查询汉语?,工作,地址,系统,信息,命令,目录,标准,状态,软件,亚洲,基

    复制项目的linux命令?

    复制项目的linux命令?,系统,项目,文件,命令,目录,源文件,语法,选项,目标,功

    linux下查询历史命令?

    linux下查询历史命令?,地址,信息,系统,服务,数据,连续,命令,数字,名称,环境,l

    linux查询表结构命令?

    linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,l

    linux网络命令查询?

    linux网络命令查询?,信息,网络,系统,地址,工作,状态,技术,电脑,命令,设备,lin

    linux查询子目录命令?

    linux查询子目录命令?,信息,系统,命令,名称,文件,名字,管理,软件,灵活,工具,L

    linux常用重定向命令?

    linux常用重定向命令?,标准,信息,设备,系统,文件,命令,内容,符号,终端,脚本,l

    linux查询状态的命令?

    linux查询状态的命令?,系统,状态,信息,管理,数据,情况,命令,综合,电脑,工具,l

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux地址查询命令?

    linux地址查询命令?,地址,网络,系统,工作,信息,设备,名称,标准,手机,管理,lin

    linux命令项目部署?

    linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎