Sto scrivendo un'applicazione asp.net 4.5 utilizzando le nuove funzionalità di routing. Ho una pagina che mostra alcune informazioni su un oggetto. Nell'evento Page_Load
, controllo i dati del percorso (ID oggetto) e le autorizzazioni utente e, se qualcosa non va bene (ad esempio, l'id è per un elemento eliminato) Io uso Response.RedirectToRoute
per inviarlo a pacco, direttamente alla home page. Non passare GO, non raccogliere $ 200.Modo corretto per saltare l'esecuzione della pagina dopo Response.RedirectToRoute
Questo ha perfettamente senso fino a quando non ho provato ad accedere a un elemento eliminato e invece della pagina iniziale ho ricevuto una pagina di errore. Ho fatto un po 'di scavo e ho scoperto che anche dopo aver usato RedirectToRoute
(a differenza del metodo standard Redirect
) il resto del codice di pagina continues to execute, che per lo meno sembra dispendioso (dato che sto per buttare via i risultati) e genera errori quando i dati necessari non esistono.
Ho fatto un po 'più SO mining e ho scoperto l'incredibile evil che è Response.End()
. Fa quello che mi serve, ma anche l'MSDN page mi dice che Response.End
è il figlio bastardo di un'antica lingua maledetta e non è adatto a vedere la luce del giorno. L'obiezione principale sembra essere il fatto che Response.End lancia un'eccezione, e questo è male per le prestazioni. Non sono lo sviluppatore più esperto, quindi non capisco completamente il problema, ma ho difficoltà a credere che il lancio di un'eccezione sia più costoso del caricamento dell'intera pagina web. Il workarounds sembra piuttosto complesso ed eccessivo per un compito così semplice, soprattutto perché la maggior parte delle pagine richiede un qualche tipo di controllo di validità.
Cosa dovrei fare in questa situazione? Usa Response.End
e chiedi perdono per la mia insolenza? Cobble insieme qualche brutto trucco? Oppure la mia prospettiva sul problema è del tutto sbagliata per cominciare? Mi piacerebbe davvero saperlo.
Aggiornamento: Ora che ci ho pensato un po 'di più, mi chiedo se ho una prospettiva sbagliata sul problema. Forse un reindirizzamento immediato non è la migliore risposta per l'esperienza dell'utente. Farei meglio a confezionare tutti i controlli in un pannello e usare qualcosa di simile?
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
Grazie per il follow su. Non avevo capito che si poteva rispondere con un codice di errore e caricare ancora la pagina. Lo terrò sicuramente a mente in futuro. –