2012-03-19 2 views
3

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

Вопрос в том, как отобразить это сообщение на редирект, который непосредственно является результатом передачи запроса, и желательно не для каких-либо дальнейших освежает? Или просто просто отобразите сообщение независимо от обновлений, что бы ни было проще и имеет наибольший смысл. Спасибо;)

ответ

2

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

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

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

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

+0

Ok groovy! : P Это предотвращает переход пользователя обратно в исходную форму запроса или это невозможно или нецелесообразно? – Chiramisu

+0

На самом деле не существует способа предотвратить переход пользователей обратно, поскольку кэширование может позволить им туда добраться. Если вам действительно нужно, есть некоторые вещи, которые вы можете сделать, чтобы они не возвращались к исходной форме, но я бы спросил, что в качестве другого вопроса о переполнении стека ;-) – cdeszaq

+0

Фантастический! Очень полезный ответ, спасибо. :) – Chiramisu