2010-05-12 14 views
25

Ho usato response.redirect nei classici webform ASP e ASP.NET. Tuttavia, con MVC 2.0, mi imbatto in qualcosa di particolare.In ASP.NET MVC, come funziona response.redirect?

Ho un metodo privato in una classe controller che viene utilizzato da più metodi di controller per aiutare a caricare e convalidare alcune informazioni. Questo metodo privato è configurato per il reindirizzamento se viene rilevato un problema in una pagina di un messaggio di errore generico.

Il grosso problema che sto notando è che la classe del controller chiamante e la visualizzazione della pagina tentano di completare il rendering e il caricamento prima che il reindirizzamento abbia effettivamente luogo. Questo è fastidioso in fase di sviluppo perché la View genera eccezioni che devo ignorare prima che la mia pagina di errore generico venga finalmente caricata.

Come accennato in precedenza, sono abituato al modello precedente di response.redirect che impediva il successivo codice su una pagina di essere eseguito mentre la nuova pagina veniva caricata.

Qualsiasi aiuto o consiglio sui reindirizzamenti in MVC sarebbe molto apprezzato.

+1

Mostraci il tuo codice. – SLaks

+0

Hai mai sentito di uno strumento diagnostico chiamato "Fiddler"? Potresti trovarlo molto utile per vedere cosa stanno facendo le tue pagine. –

+0

Suppongo che tu stia chiamando 'Response.Redirect' nel tuo metodo privato? –

risposta

42

Il meccanismo convenzionale per reindirizzare in ASP.Net MVC è restituire un oggetto di tipo RedirectResult al client. Se ciò viene fatto prima che venga chiamato il metodo View, i metodi di visualizzazione non verranno mai chiamati.

Se si chiama Response.Redirect, invece di lasciare che il front controller di Asp.Net MVC lo faccia per te, il metodo del controller continuerà fino a quando non termina o genera un'eccezione.

La soluzione idiomatica per il tuo problema è che il metodo privato restituisca un risultato che il controller può utilizzare.

ad esempio:

public ActionResult Edit(MyEntity entity) 
{ 
    if (!IsValid()) return Redirect("/oops/"); 
    ... 
    return View(); 

} 

private bool IsValid() 
{ 
    if (nozzle==NozzleState.Closed) return false; 
    if (!hoseAttached) return false; 
    return (userRole==Role.Gardener); 
} 
+0

Questo spiega cosa stavo vedendo ed è un'ottima soluzione. Grazie per l'aiuto! – Swoop

+0

Ciao Jason, puoi commentare il motivo per cui il codice continua invece del thread interrotto, come da WebForms 'Response.Redirect'? –

+0

@JasonTrue: Sì, anch'io mi chiedevo perché il thread non si interrompesse. –

18

In ASP.NET MVC, normalmente si reindirizza a un'altra pagina restituendo un RedirectResult dal metodo del controller.

Esempio:

public ActionResult Details(int id) 
{ 
    // Attempt to get record from database 
    var details = dataContext.GetDetails(id); 

    // Does requested record exist? 
    if (details == null) 
    { 
     // Does not exist - display index so user can choose 
     return RedirectToAction("Index"); 
    } 

    // Display details as usual 
    return View(details); 
} 
+0

Ottima risposta. Grazie per l'aiuto! – Swoop

-3

provare questo codice nella visualizzazione MVC pagina lode

 if (Session["UserName"] == null) 
     { 
      this.Response.Redirect("LogOn"); 

     } 
+4

Sconsigliamo fortemente di chiamare Response.Redirect in un'applicazione MVC. Dovresti restituire RedirectResult da azioni o filtri. – RickAndMSFT

+0

@RickAnd - MSFT Perché, è scoraggiato? So che ovviamente RedirectResult è superiore, ma perché Response.Redirect è scoraggiato? –

+0

Buona domanda, vedi il mio blog Response.Redirect e ASP.NET MVC - Non mixare su http://blogs.msdn.com/b/rickandy/archive/2012/03/01/response-redirect-and-asp- net-MVC-do-not-mix.aspx – RickAndMSFT

7

In MVC mai utilizzare Response.Redirect uso

return RedirectToAction("ActionResultName", "ControllerName"); 

sul perché a NOT utilizzare Response.Redirect in MVC:

  1. Problemi di prestazioni con esso
  2. Non seguendo lo schema e le convenzioni asp.net MVC specificatamente costruiti per MVC.
1

è consigliato ed è l'unico modo per reindirizzare a asp.forma netto in azione controllore mvc utilizzando

return Redirect("/page/pagename.aspx"); 

altro modo possiamo reindirizzare base (raccomandato e modo negativo)

Response.Redirect("/page/pagename.aspx", true); 

funzionerà per reindirizzamento, ma il problema è che consente di cancellare tutti i nostri valori di sessione. quindi perché non è raccomandato.

Problemi correlati