У меня есть страница .aspx, на которой данные вставляются в базу данных одним нажатием кнопки. Но когда я нажимаю кнопку, все идет правильно. Я получаю сообщение «Успешно» как «успешно вставленные данные». В этой ситуации, если я нажимаю «F5» или обновляю страницу, запускается событие нажатия кнопки. Почему так должно быть? Как избежать этого состояния?
Как избежать событий кнопки при обновлении страницы
Ответы (4)
Когда пользователь нажимает F5 (или использует кнопку панели инструментов для обновления страницы), это вызывает отправку на сервер нового запроса, идентичного предыдущему. Событие Button.Click
будет вызвано снова, но у вас есть несколько способов защитить себя от двойной вставки данных.
ИМХО, лучший способ - использовать шаблон Post / Redirect / Get. В вашем коде сразу после точки сохранения данных сделайте 302 редирект на страницу подтверждения:
protected void btnSaveStuff_Click(object sender, EventArgs e)
{
SaveStuffToDatabase();
Response.Redirect("confirmation.aspx");
}
При использовании шаблона POST
исходной страницы не попадет в историю браузера, а обновление страницы результатов приведет к повторению последнего GET
, что должно быть безопасным.
Response.Redirect
, который затем отменит POST
и сделает браузер новым GET
.
- person Jørn Schou-Rode; 01.02.2010
Добавьте это в свой класс:
#region Browser Refresh
private bool refreshState;
private bool isRefresh;
protected override void LoadViewState(object savedState)
{
object[] AllStates = (object[])savedState;
base.LoadViewState(AllStates[0]);
refreshState = bool.Parse(AllStates[1].ToString());
if (Session["ISREFRESH"] != null && Session["ISREFRESH"] != "")
isRefresh = (refreshState == (bool)Session["ISREFRESH"]);
}
protected override object SaveViewState()
{
Session["ISREFRESH"] = refreshState;
object[] AllStates = new object[3];
AllStates[0] = base.SaveViewState();
AllStates[1] = !(refreshState);
return AllStates;
}
#endregion
И в вашей кнопке нажмите, сделайте это:
protected void Button1_Click(object sender, EventArgs e)
{
if (isRefresh == false)
{
Insert Code here
LoadViewState
и SaveViewState
нужно подключить к какому-то событию (ям)? Какие из них и / или как вы это делаете?
- person RBarryYoung; 02.04.2015
Добавьте панель обновлений и установите для нее режим обновления «Условный». Это сработало для меня !!
При обновлении будет повторно отправлена форма, которую вы отправили в последний раз, когда вы нажали кнопку.
Обычно, когда вы обновляете страницу, вы думаете о том, чтобы снова получить страницу или выполнить HTTP GET, но поскольку последнее, что вы сделали, это POST (когда вы нажали кнопку отправки), браузер снова выполнит публикацию, чтобы попытаться вызвать тот же ответ.
Я предлагаю использовать шаблон Post / Redirect / Get, предложенный Йорн Скоу-Роде.
Эта статья тоже кажется актуальной. http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh