Подтвердить что ты не робот

Удалить или удалить строку запроса в ASP.Net

У меня есть QueryString с именем 'flagEdit', и я хочу удалить его после получения его значения. Но когда я пытаюсь удалить его с помощью

Request.QueryString.Clear();

или

Request.QueryString.Remove("editFlag");

Эта ошибка возникает -

System.NotSupportedException: коллекция доступна только для чтения.

Итак, я хочу знать, как удалить строку запроса после того, как она выбрала значение

4b9b3361

Ответ 1

Удаление (удаление) Querystring в 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);

Надеюсь, что это поможет

Ответ 2

Если вы беспокоитесь о том, что будущие обратные страницы страницы работают с тем же кодом, который вы планировали запустить, когда значение querystring имеет значение, просто добавьте условие if (! Page.IsPostBack).

Ответ 3

Если вы хотите очистить весь QueryString, это сработало для меня:

Response.Redirect(Request.RawUrl.Replace(Request.Url.Query, ""));

Я очищал форму, в которой некоторые поля были автоматически заполнены QueryString, поэтому они хотели бы уничтожить все это.

Однако ответы других парней, вероятно, лучше, если вы нацеливаете определенный параметр и хотите оставить остальные.

Ответ 4

Я взял на себя смелость в ответе @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")