如何从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)
;
- 通过使用
HttpContext.Request.QueryString
收集您的查询string。 它默认为一个NameValueCollection
types。 - 将其转换为string并使用
System.Web.HttpUtility.ParseQueryString()
来parsing查询string(它将再次返回NameValueCollection
)。 - 然后可以使用
Remove()
函数删除特定的参数(使用键来引用该参数以删除)。 - 用查询参数返回一个string,并使用
string.Join()
将查询string格式化为您的URL可读的有效查询参数。
请参阅下面的工作示例,其中param_to_remove
是要删除的参数。
假设您的查询参数是param1=1¶m_to_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]));
现在你的查询string应该是param1=1¶m2=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>");