如何使用c#从asp.net中的querystring中删除项目?

时间:2009-02-09 19:35:38

标签: c# .net asp.net query-string

我想从我的网址中删除“语言”查询字符串。我怎样才能做到这一点 ? (使用Asp.net 3.5,c#)

Default.aspx?Agent=10&Language=2

我想删除“语言= 2”,但语言将是第一个,中间或最后一个。所以我会有这个

Default.aspx?Agent=20

15 个答案:

答案 0 :(得分:114)

如果它是HttpRequest.QueryString,那么您可以将该集合复制到一个可写集合中,然后使用它。

NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");

答案 1 :(得分:44)

这是一种简单的方法。不需要反射器。

    public static string GetQueryStringWithOutParameter(string parameter)
    {
        var nameValueCollection = System.Web.HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
        nameValueCollection.Remove(parameter);
        string url = HttpContext.Current.Request.Path + "?" + nameValueCollection;

        return url;
    }

此处QueryString.ToString()是必需的,因为Request.QueryString集合是只读的。

答案 2 :(得分:36)

最后,

hmemcpy回答完全适合我,感谢其他回答的朋友。

我使用Reflector抓取HttpValueCollection并编写以下代码

        var hebe = new HttpValueCollection();
        hebe.Add(HttpUtility.ParseQueryString(Request.Url.Query));

        if (!string.IsNullOrEmpty(hebe["Language"]))
            hebe.Remove("Language");

        Response.Redirect(Request.Url.AbsolutePath + "?" + hebe );

答案 3 :(得分:26)

我个人的偏好是重写查询或在较低点使用namevaluecollection,但有时候业务逻辑不会使这些都非常有用,有时反射确实是你需要的。在这种情况下,你可以暂时关闭readonly标志:

// reflect to readonly property
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

// make collection editable
isreadonly.SetValue(this.Request.QueryString, false, null);

// remove
this.Request.QueryString.Remove("foo");

// modify
this.Request.QueryString.Set("bar", "123");

// make collection readonly again
isreadonly.SetValue(this.Request.QueryString, true, null);

答案 4 :(得分:10)

我前一回答similar question。基本上,最好的方法是使用HttpValueCollection属性实际所在的类QueryString,不幸的是它是.NET框架内部的。 您可以使用Reflector来抓取它(并将其放入Utils类中)。这样您就可以像NameValueCollection一样操纵查询字符串,但是所有的url编码/解码问题都会得到照顾。

HttpValueCollection扩展NameValueCollection,并且有一个构造函数,它接受一个编码的查询字符串(包含&符号和问号),并覆盖ToString()方法以便稍后重建查询字符串基础集合。

答案 5 :(得分:3)

试试这个......

PropertyInfo isreadonly   =typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);    

isreadonly.SetValue(this.Request.QueryString, false, null);
this.Request.QueryString.Remove("foo");

答案 6 :(得分:1)

您无法明确是否尝试在Request对象中修改Querystring。由于该属性是只读的,我想我们假设你只想弄乱字符串。

......在这种情况下,它的边界是微不足道的。

  • 从请求中获取查询字符串
  • .split()on'&'
  • 将它重新组合成一个新字符串,同时嗅探并抛出任何以“language”开头的内容

答案 7 :(得分:1)

获取查询字符串集合,将其解析为(name=value pair)字符串,不包括要删除的字符串,并将其命名为newQueryString

然后拨打Response.Redirect(known_path?newqueryString);

答案 8 :(得分:1)

  1. 使用HttpContext.Request.QueryString收集查询字符串。它默认为NameValueCollection类型。
  2. 将其转换为字符串,并使用System.Web.HttpUtility.ParseQueryString()来解析查询字符串(再次返回NameValueCollection)。
  3. 然后,您可以使用Remove()函数删除特定参数(使用键引用要删除的参数)。
  4. 使用查询参数返回字符串并使用string.Join()将查询字符串格式化为URL可读的有效查询参数。
  5. 请参阅下面的工作示例,其中param_to_remove是您要删除的参数。

    我们假设您的查询参数为param1=1&param_to_remove=stuff&param2=2。运行以下行:

    var queryParams = System.Web.HttpUtility.ParseQueryString(HttpContext.Request.QueryString.ToString());
    queryParams.Remove("param_to_remove");
    string queryString = string.Join("&", queryParams.Cast<string>().Select(e => e + "=" + queryParams[e]));
    

    现在您的查询字符串应为param1=1&param2=2

答案 9 :(得分:0)

您可能希望使用正则表达式来查找要从查询字符串中删除的参数,然后将其删除并使用新的查询字符串将浏览器重定向到同一文件。

答案 10 :(得分:0)

是的,.NET中没有内置类来编辑查询字符串。您必须使用Regex或其他一些更改字符串本身的方法。

答案 11 :(得分:0)

如果您已将查询字符串作为字符串,则还可以使用简单的字符串操作:

int pos = queryString.ToLower().IndexOf("parameter=");
if (pos >= 0)
{
    int pos_end = queryString.IndexOf("&", pos);
    if (pos_end >= 0)   // there are additional parameters after this one
        queryString = queryString.Substring(0, pos) + queryString.Substring(pos_end + 1);
    else
        if (pos == 0) // this one is the only parameter
            queryString = "";
        else        // this one is the last parameter
            queryString=queryString.Substring(0, pos - 1);
}

答案 12 :(得分:0)

我有一个简单的解决方案,但有一些javascript涉及。

假设查询字符串是&#34; ok = 1&#34;

    string url = Request.Url.AbsoluteUri.Replace("&ok=1", "");
   url = Request.Url.AbsoluteUri.Replace("?ok=1", "");
  Response.Write("<script>window.location = '"+url+"';</script>");

答案 13 :(得分:0)

import { CoreModule, ApiService } from '@app-core'

https://regexr.com/3i9vj

答案 14 :(得分:0)

将查询字符串解析为NameValueCollection。删除一个项目。并使用toString将其转换回查询字符串。

using System.Collections.Specialized;

NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
filteredQueryString.Remove("appKey");

var queryString = '?'+ filteredQueryString.ToString();