如何使用c#从asp.net中的querystring中删除项?
我想从我的url中删除“语言”查询字符串。我该怎么做?(使用Asp.net 3.5,c#) 我想删除“Language=2”,但Language将是第一个、中间个或最后一个。所以我要这个如何使用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。
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()将其放在“&”上
- 将其重新组合成一个新字符串,同时嗅探并抛出以“语言”开头的任何内容
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();