Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#从asp.net中的querystring中删除项?_C#_.net_Asp.net_Query String - Fatal编程技术网

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

如何使用c#从asp.net中的querystring中删除项?,c#,.net,asp.net,query-string,C#,.net,Asp.net,Query String,我想从我的url中删除“语言”查询字符串。我该怎么做?(使用Asp.net 3.5,c#) 我想删除“Language=2”,但Language将是第一个、中间个或最后一个。所以我要这个 Default.aspx?Agent=20 您可能需要使用正则表达式查找要从查询字符串中删除的参数,然后删除它并将浏览器重定向到与新查询字符串相同的文件。是的,.NET中没有内置用于编辑查询字符串的类。您必须使用正则表达式或其他方法来更改字符串本身 您不清楚是否正在尝试修改请求对象中的Querystring。

我想从我的url中删除“语言”查询字符串。我该怎么做?(使用Asp.net 3.5,c#)

我想删除“Language=2”,但Language将是第一个、中间个或最后一个。所以我要这个

Default.aspx?Agent=20

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

是的,.NET中没有内置用于编辑查询字符串的类。您必须使用正则表达式或其他方法来更改字符串本身

您不清楚是否正在尝试修改请求对象中的Querystring。由于该属性是只读的,我想我们假设您只是想搞乱字符串

using System.Collections.Specialized;

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

var queryString = '?'+ filteredQueryString.ToString();
。。。在这种情况下,这是微不足道的

  • 从请求中提取查询字符串
  • .split()将其放在“&”上
  • 将其重新组合成一个新字符串,同时嗅探并抛出以“语言”开头的任何内容

获取querystring集合,将其解析为(
name=value对
)字符串,不包括要删除的字符串,然后将其命名为newQueryString


然后调用
Response.Redirect(已知路径?newqueryString)

如果是HttpRequest.QueryString,则可以将集合复制到可写集合中,并按自己的方式进行操作

NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");
我刚才回答了。基本上,最好的方法是使用类
HttpValueCollection
,而
QueryString
属性实际上是该类,不幸的是它是.NET framework中的内部属性。 您可以使用Reflector抓取它(并将其放入Utils类中)。通过这种方式,您可以像处理NameValueCollection一样处理查询字符串,但所有url编码/解码问题都由您处理

HttpValueCollection
扩展了
NameValueCollection
,并具有一个构造函数,该构造函数接受编码查询字符串(包括符号和问号),它重写了
ToString()
方法,以便以后从基础集合重建查询字符串。

最后

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 );

我个人的偏好是重写查询或在较低的位置使用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);

这里有一个简单的方法。不需要反射器

    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
集合是只读的。

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

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);
}
试试这个

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");

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

假设查询字符串为“ok=1”

stringurl=Request.url.AbsoluteUri.Replace(“&ok=1”,”);
url=Request.url.AbsoluteUri.Replace(“?ok=1”,”);
Write(“window.location=”+url+“;”);
  • 使用
    HttpContext.Request.QueryString
    收集查询字符串。它默认为
    NameValueCollection
    类型
  • 将其转换为字符串,并使用
    System.Web.HttpUtility.ParseQueryString()
    解析查询字符串(再次返回
    NameValueCollection
  • 然后可以使用
    Remove()
    函数删除特定参数(使用键引用要删除的参数)
  • 用例将查询参数返回到字符串,并使用
    string.Join()
    将查询字符串格式化为URL可读的内容,作为有效的查询参数
  • 请参见下面的工作示例,其中
    param_to_remove
    是要删除的参数

    假设您的查询参数是
    param1=1¶m\u to\u remove=stuff¶m2=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]));
    
    var queryParams=System.Web.HttpUtility.ParseQueryString(HttpContext.Request.QueryString.ToString());
    queryParams.Remove(“参数到移除”);
    字符串queryString=string.Join(&),queryParams.Cast().Select(e=>e+“=”+queryParams[e]);
    
    现在,您的查询字符串应该是
    param1=1¶m2=2

    string queryString = "Default.aspx?Agent=10&Language=2"; //Request.QueryString.ToString();
    string parameterToRemove="Language";   //parameter which we want to remove
    string regex=string.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove);
    string finalQS = Regex.Replace(queryString, regex, "");
    

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

    using System.Collections.Specialized;
    
    NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
    filteredQueryString.Remove("appKey");
    
    var queryString = '?'+ filteredQueryString.ToString();
    

    同意,如果您不想弄乱正则表达式,请从Rquest.Url.Query获取查询,在&上拆分,并在不使用语言querystring的情况下重新生成它。您可以使用UriBuilder,但它不需要名称-值对来构建QueryString:(很久以前,我构建了自己的LinkUri类,它可以拆分URL,使用key/value和.tostring()构建URL)基本上,它做了你希望UriBuilder做的事情。4年前花了一个上午来组装,我每天都在使用它。我知道,我讨厌玩弦,哦,上帝:)但是用这种方式我感觉最舒服。。。所以这个例子是:return(newlinkuri(Request.Url)).Remove(“language”).ToString();我读过你的帖子,听起来很棒。谢谢你的回答,我会尝试一下,然后回来。我不确定这是否是2009年唯一可用的方法,但在这个问题的另一个答案中有另一种方法没有反映:这既简单又优雅-希望我能碰几次谢谢道格。我对这个公认的答案有点困惑。听起来提问者正在导致另一个导航发生,以从querystring.System.Collections.Specialized.NameValueCollection filtered=new System.Collections.Specialized.NameValueCollection(Request.querystring)中获取不需要的参数;好东西。这一点都不危险吗?是什么
    using System.Collections.Specialized;
    
    NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
    filteredQueryString.Remove("appKey");
    
    var queryString = '?'+ filteredQueryString.ToString();