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

我想从我的url中删除“语言”查询string。 我怎样才能做到这一点? (使用Asp.net 3.5,C#)

Default.aspx?Agent=10&Language=2 

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

 Default.aspx?Agent=20 

我刚才回答了一个类似的问题 。 基本上,最好的方法是使用QueryString属性实际上是类HttpValueCollection ,不幸的是它在.NET框架内部。 你可以使用Reflector来抓取它(并把它放到你的Utils类中)。 这样,您可以像查询NameValueCollection一样操作查询string,但是所有的url编码/解码问题都会照顾到您。

HttpValueCollection扩展了NameValueCollection ,并且有一个构造函数,它接受一个编码的查询string(包括&符号和问号),并且重写一个ToString()方法以便稍后从底层集合重build查询string。

如果是HttpRequest.QueryString,那么你可以将这个集合复制到一个可写的集合中,并且用它来实现。

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

这是一个简单的方法。 reflection器是不需要的。

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

最后,

hmemcpy的回答完全是为了我,也感谢其他回答的朋友。

我使用reflection器来获取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,但是在某些情况下,业务逻辑使这些都不是非常有用,有时reflection确实是你所需要的。 在这种情况下,您可以closuresreadonly标志片刻,如下所示:

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

尝试这个 …

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

你不清楚你是否试图修改查询对象中的查询string。 由于该属性是只读的,我想我们会假设你只是想弄乱string。

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

  • 从请求中获取查询string
  • .split()在'&'上
  • 把它放回一个新的string,同时嗅探和抛出任何以“语言”开头的东西,

获取查询string集合,将其parsing为一个( name=value pair )string,不包括要移除的string,并将其命名为newQueryString

然后调用Response.Redirect(known_path?newqueryString) ;

  1. 通过使用HttpContext.Request.QueryString收集您的查询string。 它默认为一个NameValueCollectiontypes。
  2. 将其转换为string并使用System.Web.HttpUtility.ParseQueryString()来parsing查询string(它将再次返回NameValueCollection )。
  3. 然后可以使用Remove()函数删除特定的参数(使用键来引用该参数以删除)。
  4. 用查询参数返回一个string,并使用string.Join()将查询string格式化为您的URL可读的有效查询参数。

请参阅下面的工作示例,其中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])); 

现在你的查询string应该是param1=1&param2=2

您可能要使用正则expression式来查找要从查询string中删除的参数,然后将其删除,并使用新的查询string将浏览器redirect到相同的文件。

是的,.NET中没有内置编辑查询string的类。 你将不得不使用正则expression式或其他一些方法来改变string本身。

如果已经将查询string作为string,那么也可以使用简单的string操作:

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

以及我有一个简单的解决scheme,但有一个JavaScript涉及。

假设查询string是“ok = 1”

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