在ASP.Net中清除或删除查询字符串

时间:2014-01-22 10:18:56

标签: c# asp.net

我有QueryString名为'flagEdit',我想在获取它的值后将其删除。 但是当我尝试使用

删除它时
Request.QueryString.Clear();

Request.QueryString.Remove("editFlag");

发生此错误 -

  

System.NotSupportedException:Collection是只读的。

所以,我想知道如何在获取它的值后删除查询字符串

4 个答案:

答案 0 :(得分:40)

Removing (Deleting) Querystring in ASP.NET

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