Страница переадресации-получения (PRG) на странице Отправить
Поэтому я прочитал об этом методе, называемом PRG, как способ решения проблемы двойной отправки формы. Однако мне еще предстоит найти нисходящую реализацию страницы "Сводка / сообщение об успехе", отображаемой для пользователя. Я могу думать только о том, чтобы сохранить переменную сеанса, но я не хочу, чтобы она сохранялась при многократных обновлениях. Это должно показать сообщение / резюме один раз, и будет сделано. Кроме того, было бы идеально, если бы пользователь не мог вернуться на ранее представленную страницу.
Вот мой код PRG:
Protected Sub InsertRequest() Handles wizard.FinishButtonClick
Using connection As New SqlConnection(connectionStr)
Dim insertQuery As New SqlCommand("spInsertRequest", connection)
insertQuery.CommandType = CommandType.StoredProcedure
'1 - SETUP SQL PARAMETERS (omitted for brevity)
'2 - POST (inserts record into DB)
Try
connection.Open()
insertQuery.ExecuteNonQuery()
connection.Close()
Catch ex As Exception
Logger.WriteToErrorLog(Me, ex.Source, ex.Message, ex.StackTrace)
End Try
'3 - REDIRECT (to the same page and...)
Try
Dim urlRedirect As String = If(IsNothing(Request.Url), "", IO.Path.GetFileName(Request.Url.AbsolutePath)) 'Gets the filename of the current page.
If Not String.IsNullOrEmpty(urlRedirect) Then
Session.Add("referrerPage", urlRedirect) 'Used for identifying when the page is being redirected back to itself.
PageExt.AddParam(urlRedirect, "id", recID.ToString)
Response.Redirect(urlRedirect)
End If
Catch ex As Exception
Logger.WriteToErrorLog(Me, ex.Source, ex.Message, ex.StackTrace)
End Try
End Sub
'4 - GET (Display 'Success' message/summary here)
Вопрос в том, как отобразить это сообщение на перенаправлении, которое является прямым результатом отправки, и желательно не для каких-либо дальнейших обновлений? Или просто отображать сообщение независимо от обновлений, что бы ни было проще и выгоднее. Спасибо;)
1 ответ
Хитрость в том, чтобы сообщения, подобные этому, отображались только один раз, заключается в использовании концепции "флэш" данных сеанса.
Обычно это работает, чтобы сохранить "сообщение" (или любые другие данные, связанные с "успехом", которые вам нужны) в сеансе до перенаправления. Затем при обработке перенаправления обязательно удалите данные флэш-памяти из сеанса до отправки ответа "страница успеха".
Таким образом, если пользователь попытается вернуться на страницу успеха, данные флэш-памяти не будут присутствовать в сеансе, который нужно забрать, поэтому они не будут отображаться дважды. Чтобы быть приятным для пользователей, вы можете проверить, что флэш-данные отсутствуют, и отобразить приятное сообщение об ошибке, если они пытаются попасть на страницу успеха вне потока Post-Redirect-Get.
Это именно то, что делает среда Grails (в мире Groovy), и она работает очень хорошо.