2010-04-20 14 views
20

Sono abbastanza nuovo per MVC, ma non so esattamente quale Redirect ... sostituisce il reindirizzamento standard utilizzato in WebForms cioè lo standard Response.Redirect()ASP.NET MVC: qual è il modo corretto per reindirizzare a pagine/azioni in MVC?

Per esempio, ho bisogno di reindirizzare ad altre pagine in un paio di scenari:

1) Quando l'utente si disconnette (firma moduli in Azione) Desidero reindirizzare a una pagina di accesso.

2) In un controller o di base Controller evento per esempio Initialize, voglio reindirizzare a un'altra pagina (AbsoluteRootUrl + Controller + Azione)

Sembra che più reindirizzamenti vengono chiamati in alcuni casi che causa errori, qualcosa da fare con il fatto che una pagina è già in corso di reindirizzamento? Come si può cancellare la richiesta corrente e semplicemente reindirizzare?

Aggiornamento:

La risposta a questa domanda (System.Web.Mvc.Controller Initialize) indica che Initialize non deve essere utilizzato e OnActionExecuting dovrebbe essere utilizzato?

Qualsiasi commento sul motivo per cui Initialize non deve essere utilizzato o perché OnAuthorization non è un'opzione migliore?

Ulteriori informazioni:

Questo post del blog (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) indica che OnActionExecuting è utile per l'autenticazione (come indicato nel link qui sotto) Credo che l'aggiunta di questa a quell'evento nella classe base Controller va bene come ogni la pagina esegue un'azione in MVC, quindi non dovrebbe fare molta differenza e avere la possibilità di reindirizzare dovrebbe essere più facile. Questo ha senso, ma sembra anche avere senso per me che le cose potrebbero essere fatte in un evento prima di questo evento e ci facciamo mettere in discussione per cosa sono fatti quegli eventi? Sarà dando OnActionExecuting un andare ..

+0

Cos'è questo controller di base inizializzare caso lei ha citato? –

+0

@Mahesh Velaga: Ho un controller di base che sovrascrive l'evento di inizializzazione, ovvero override protetto, inizializzazione (System.Web.Routing.RequestContext requestContext) ... Ho alcuni controlli di sicurezza e devo reindirizzare gli utenti in base a tali controlli –

+0

Perché non impostare alcuni valori in tempdata o viewdata e quando si raggiunge l'azione del controller in base al valore che è possibile reindirizzare utilizzando RedirectToAction? –

risposta

19

1) Quando l'utente si disconnette (Forme signout in Action) Voglio reindirizzare a una pagina di login.

public ActionResult Logout() { 
    //log out the user 
    return RedirectToAction("Login"); 
} 

2) In un evento Controller o base controller per esempio Initialze, voglio reindirizzare a un'altra pagina (AbsoluteRootUrl + Controller + Azione)

perché si vuole reindirizzare da un'init controllore?

il motore di routing gestisce automaticamente le richieste che arrivano, se si intende che si desidera reindirizzare dall'azione index su un controller di fare semplicemente:

public ActionResult Index() { 
    return RedirectToAction("whateverAction", "whateverController"); 
} 
+0

Potrebbe voler notare che il primo elemento è nel controller account. – GalacticCowboy

+0

Continuo a pensare che usando FormsAuthentication.RedirectToLoginPage() dovrebbe essere usato invece di return RedirectToAction ("Login"); –

+0

L'evento di inizializzazione del controller sta rilevando i sottodomini per una multi-tenancy, rilevando le modifiche ai sottodomini e controllando anche l'autenticazione dell'utente in base a ciò. –

2
RedirectToAction("actionName", "controllerName"); 

Ha altri sovraccarichi così, si prega di check-up!

Inoltre, se si è nuovi e non si utilizza T4MVC, quindi si consiglia di utilizzarlo!

ti dà Intellisence per azioni, Controller, viste ecc (stringhe non più magici)

+0

Questo è buono per il numero 1, ma non lo si ha nel numero 2. –

+0

In effetti, in caso numero 2, il RedirectToAction sembra essere ignorato? –

4

1) Per reindirizzare alla pagina di login/dalla pagina di login, non utilizzare il() metodi di reindirizzamento. Utilizzare FormsAuthentication.RedirectToLoginPage() e FormsAuthentication.RedirectFromLoginPage()!

2) È necessario utilizzare RedirectToAction ("azione", "controller") in scenari regolari. Si desidera reindirizzare il metodo Initialize a lato? Perché? Non vedo perché vorresti mai farlo, e nella maggior parte dei casi dovresti rivedere il tuo approccio in questo modo ..Se si vuole fare questo per l'autenticazione questo è sicuramente il modo sbagliato (con scarsissimi probabilità Foe un'eccezione) Utilizzare l'attributo [Authorize] sul controller o il metodo, invece :)

UPD: se si dispone di una certa sicurezza controlli nel metodo di inizializzazione, e l'utente non ha accesso a questo metodo, si può fare un paio di cose: una)

Response.StatusCode = 403; 
Response.End(); 

questo invierà l'utente alla pagina di login. Se si vuole mandarlo a un percorso personalizzato, si può fare qualcosa di simile (circospetti: pseudocode)

Response.Redirect(Url.Action("action", "controller")); 

Non c'è bisogno di specificare l'URL completo. Questo dovrebbe essere sufficiente. Se completamente insistono sulla piena url:

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString()); 
+0

Esiste un controllo di autenticazione, ma è più relativo al controllo di un utente su un titolare in un'applicazione multi-tenancy e su altri controlli di sicurezza. Se c'è una violazione, l'utente dovrebbe essere disconnesso e reindirizzato da qualche parte (questo potrebbe essere un accesso generico, login specifico, home page o altra pagina) –

+0

Bene .. La mia risposta sembra coprire questo, no? A meno che non mi sia sfuggito qualcosa, in tal caso sarò felice di aiutarti) –

+0

I reindirizzamenti non sembrano funzionare per inizializzare del tutto, quindi avere un ripensamento ... aggiungere ulteriori informazioni alla domanda ... –

Problemi correlati