Piszę aplikację asp.net 4.5 za pomocą nowych funkcji routingu. Mam stronę, która wyświetla pewne informacje na temat przedmiotu. W zdarzeniu Page_Load
sprawdzam dane trasy (identyfikator produktu) i uprawnienia użytkownika, a jeśli coś jest nie tak (np. Identyfikator dotyczy usuniętego elementu) używam Response.RedirectToRoute
, aby wysłać je do pakowania, z powrotem do strony głównej. Nie przechodź GO, nie zbieraj 200 $.Prawidłowy sposób na pomijanie wykonywania strony po Response.RedirectToRoute
To miało sens, dopóki nie próbowałem uzyskać dostępu do usuniętego elementu, a zamiast strony głównej otrzymałem stronę błędu. Zrobiłem trochę kopania i odkryłem, że nawet po użyciu RedirectToRoute
(w przeciwieństwie do standardowej metody Redirect
), pozostałej części kodu strony continues to execute, który co najmniej wydaje się nieużyteczny (ponieważ mam zamiar wyrzucić wyniki) i generuje błędy gdy niezbędne dane nie istnieją.
Zrobiłem trochę więcej SO górnictwa i odkryłem niesamowitą evil, która jest Response.End()
. Robi to, czego potrzebuję, ale nawet MSDN page mówi, że jest to bękartowe dziecko starożytnego przeklętego języka i nie nadaje się do oglądania światła dziennego. Podstawowym zarzutem wydaje się być fakt, że Response.End zgłasza wyjątek, a to źle wpływa na wydajność. Nie jestem najbardziej doświadczonym programistą, więc nie rozumiem tego problemu w całości, ale mam problem z przekonaniem, że zgłoszenie wyjątku jest droższe niż załadowanie całej strony internetowej. Model workarounds wydaje się dość złożony i nadmiernie skomplikowany, jeśli chodzi o proste zadanie, zwłaszcza że większość stron wymaga pewnego rodzaju sprawdzenia poprawności.
Co powinienem zrobić w tej sytuacji? Użyj Response.End
i błagaj o wybaczenie mojej bezczelności? Wymieszać jakiś brzydki sposób obejścia problemu? A może moje zdanie na temat problemu jest od początku błędne? Naprawdę chciałbym wiedzieć.
Aktualizacja: Teraz, gdy przemyślałem to nieco dłużej, zastanawiam się, czy mam złą perspektywę na problem. Być może natychmiastowe przekierowanie nie jest najlepszą odpowiedzią na wrażenia użytkownika. Czy lepiej byłoby owijać wszystkie kontrolki w panelu i używać czegoś takiego?
Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
'Validation Code
If notValid Then
ControlsPanel.Visible = false
ErrorPanel.Visible = true
End If
End Sub
Dzięki za obserwacji w górę. Nie zdawałem sobie sprawy, że możesz odpowiedzieć kodem błędu i nadal ładować stronę. Na pewno będę o tym pamiętać w przyszłości. –