Страница переадресации-получения (PRG) на странице Отправить - PullRequest
3 голосов
/ 19 марта 2012

Итак, я прочитал об этом методе, называемом 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 Ответ

2 голосов
/ 19 марта 2012

Хитрость в том, чтобы сообщения, подобные этому, отображались только один раз, заключается в использовании концепции «флэш» данных сеанса.

Обычно это работает так, чтобы сохранить «сообщение» (или любые другие данные, относящиеся к «успеху», которые вам нужны) в сеансе до перенаправления.Затем при обработке перенаправления обязательно удалите данные флэш-памяти из сеанса до отправки ответа «страница успеха».

Таким образом, если пользователь пытается вернуться кНа странице успеха данные флэш-памяти не будут присутствовать во время сеанса, поэтому они не будут отображаться дважды.Чтобы быть приятным для пользователей, вы можете проверить, что флэш-данные отсутствуют, и отобразить приятное сообщение об ошибке, если они пытаются попасть на страницу успеха за пределами потока Post-Redirect-Get.

Этоименно то, что делает среда Grails (в мире Groovy), и она работает очень хорошо.

...