我有QueryString
名为'flagEdit',我想在获取它的值后将其删除。
但是当我尝试使用
Request.QueryString.Clear();
或
Request.QueryString.Remove("editFlag");
发生此错误 -
System.NotSupportedException:Collection是只读的。
所以,我想知道如何在获取它的值后删除查询字符串
答案 0 :(得分:40)
Request.QueryString.Remove("editFlag")
如果您执行上述操作,则会出现错误
收集是只读的。
因此,我们需要在删除查询字符串之前编写以下代码。
试试这种方式
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("editFlag");
您也可以尝试这种方式
var nvc = HttpUtility.ParseQueryString(Request.Url.Query);
nvc.Remove("editFlag");
string url = Request.Url.AbsolutePath + "?" + nvc.ToString();
Response.Redirect(url);
希望这有帮助
答案 1 :(得分:9)
如果您担心将来的页面回发运行与querystring有值时要运行的相同代码,只需添加if(!Page.IsPostBack)条件。
答案 2 :(得分:5)
如果您要清除整个QueryString
,这对我有用:
Response.Redirect(Request.RawUrl.Replace(Request.Url.Query, ""));
我正在清除一个由QueryString
自动填充的字段的表单,因此想要打破整个事情。
然而,其他人'如果您要定位特定参数并希望保留其余参数,答案可能会更好。
答案 3 :(得分:1)
我在@Amarnath Balasubramanian的回答中取得了自由, 并使其成为一个方便的功能,也可以在VB.NET中轻松调用。
public static bool RemoveQueryString(ref System.Web.HttpRequest httpReq, string key)
{
PropertyInfo requestQueryString = null;
bool bCanProceed = true;
try {
try {
requestQueryString = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
} catch (System.Reflection.AmbiguousMatchException) {
bCanProceed = false;
} catch (System.ArgumentNullException) {
bCanProceed = false;
}
if (bCanProceed) {
try {
if (requestQueryString != null) {
// make collection editable
requestQueryString.SetValue(httpReq.QueryString, false, null);
} else bCanProceed = false;
} catch (System.Reflection.TargetException) {
bCanProceed = false;
} catch (System.Reflection.TargetParameterCountException) {
bCanProceed = false;
} catch (System.Reflection.TargetInvocationException) {
bCanProceed = false;
} catch (System.MethodAccessException) {
bCanProceed = false;
} catch (System.ArgumentException) {
bCanProceed = false;
}
if (bCanProceed) {
try {
// remove
httpReq.QueryString.Remove(key);
} catch (System.NotSupportedException) {
bCanProceed = false;
}
}
}
} catch (System.Exception) {
bCanProceed = false;
}
return bCanProceed;
}
从VB.NET中调用它:
RemoveQueryString(Me.Request, "some_query_key_here")