Удалить или удалить строку запроса в ASP.Net
У меня есть QueryString
с именем 'flagEdit', и я хочу удалить его после получения его значения.
Но когда я пытаюсь удалить его с помощью
Request.QueryString.Clear();
или
Request.QueryString.Remove("editFlag");
Эта ошибка возникает -
System.NotSupportedException: коллекция доступна только для чтения.
Итак, я хочу знать, как удалить строку запроса после того, как она выбрала значение
Ответы
Ответ 1
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")