Есть ли способ очистить параметры строки запроса при отправке назад?
У меня есть форма, которая иногда связана с некоторыми параметрами строки запроса. Проблема в том, что когда я отправляю обратно форму, параметр строки запроса все еще там. На самом деле это не проблема, как у меня это настроено, но мне просто не нравится, когда он там есть, и я могу видеть, что это проблема, если вам нужно проверить ввод в определенном порядке.
Есть ли способ очистить этот параметр строки запроса простым и понятным способом? Я знаю, что мог бы изменить PostBackURL на кнопке, но это не кажется слишком эффективным.
11 ответов
Я думаю, что вы ответили на свой вопрос. Используйте свойство PostBackURL.
<asp:Button PostBackUrl='<%# Request.ServerVariables["URL"] %>' runat="server" Text="Submit" />
Или что-то вроде
foreach (Control ctrl in Page.Controls)
{
if (ctrl is Button)
{
((Button)ctrl).PostBackUrl = Request.ServerVariables["URL"];
}
}
Положить это внизу вашей страницы?
<script language="javascript" type="text/javascript">
document.forms[0].action = window.location.pathname;
</script>
Я застрял с той же проблемой.
Я решил это, используя следующий блок кода:
private void ClearQueryString()
{
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
isreadonly.SetValue(this.Request.QueryString, false, null);
this.Request.QueryString.Remove("Action");
this.Request.QueryString.Remove("param1");
this.Request.QueryString.Remove("paramN");
}
Вы можете в некоторых случаях использовать Server.Transfer()
метод с перегрузкой, позволяющий указать, должны ли данные строки запроса и формы сохраняться или нет.
Я только что столкнулся с той же проблемой, и после некоторой охоты в Интернете я нашел этот фрагмент:
public void ClearQueryStrings()
{
string clientCommand = string.Format(
"document.forms[\"{0}\"].action = \"{1}\";",
this.Form.Name, Request.Url.Segments[Request.Url.Segments.Length - 1]);
ClientScript.RegisterStartupScript(this.GetType(), "qr", clientCommand, true);
}
Я вызываю ClearQueryStrings() в моей Page_Load после завершения обработки исходных параметров строки запроса. Когда страница отправляет обратно, параметры исчезли.
Я предполагаю, что вы не можете полагаться на Page.IsPostBack по какой-то причине?
Если то, что вы делаете, на стороне сервера, тогда просто добавить проверку для IsPostBack в ваших методах (Page_Load, OnInit и т. Д.) И обрабатывать строки запроса только в том случае, если это не обратная запись (то есть первоначальный запрос).
Когда код javascript выполняется, он очищает URL-адрес
<script language="javascript" type="text/javascript">
var urlWithoutParams = location.protocol + "//" + location.host + location.pathname;
function clearCurrentURL(){
window.history.replaceState({}, document.title, urlWithoutParams);
}
</script>
Этот метод не тот, который вы бы назвали редиректом, но он определенно сотрет строку запроса. Просто добавьте эту строку в конец вашего кода JavaScript:
window.location.search = "";
Или же
Добавьте это в конец вашей HTML-страницы:
<script type="text/javascript">
window.location.search = "";
</script>
В зависимости от того, где вы вставили код, время удаления строки запроса будет меняться.
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("status");
using System.Collections;
using System.Reflection;
Используйте следующий код для очистки параметров строки запроса.
// To clear Query string value
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("YourQueryStringParameter");
Ты можешь попробовать Response.Redirect(Request.CurrentExecutionFilePath());
Это работает для меня.