2011-09-13 22 views
5

Nel contesto di ASP.net MVC3, ho questa riga di codice in un'azione controller che tenta di reindirizzare a un URL particolare.Reindirizzamento (url) non funzionante

return Redirect(returnUrl); 

returnUrl è una stringa che contiene "/ Home/Index /". Per qualche motivo il reindirizzamento non sta avendo luogo e io resto sullo stesso schermo. Ho provato a rimuovere la barra finale, ma senza successo. Qualche idea sul perché il reindirizzamento non ha luogo?

risposta

13

Il metodo Redirect deve essere utilizzato per reindirizzare a URL esterni del sito e facendolo passare un URL assoluto. Se avete bisogno di reindirizzare ad un'altra azione controller che appartiene al tuo sito, sarebbe meglio usare questo:

return RedirectToAction("Index", "Home"); 

In questo modo non si è più sta hardcoding gli URL e il codice è meno fragile di cambiamenti di rotta.

Detto questo, se stai invocando l'azione del controller che esegue questo reindirizzamento con AJAX non puoi aspettarti che reindirizzi il browser ovunque => rimarrà ovviamente sulla stessa pagina. La richiesta AJAX avrà esito positivo dopo tutti i reindirizzamenti e nella callback di successo si otterrà l'HTML finale dell'URL /Home/Index come se fosse richiesto senza AJAX.

Se si desidera reindirizzare nel callback successo di un AJAX chiamare potrebbe avere il ritorno azione di controllo, per esempio un oggetto JSON che indica l'URL di destinazione che si desidera reindirizzare a:

return Json(new { redirectToUrl = Url.Action("Index", "Home") }); 

e nella vostra callback utilizzare la funzione window.location.href:

success: function(result) { 
    window.location.href = result.redirectToUrl; 
} 
+0

Prima di tutto grazie per questa risposta esauriente. Non sto usando AJAX qui, quindi possiamo escludere la seconda parte della risposta. Idealmente mi piacerebbe utilizzare RedirectToAction() ma sto usando l'autenticazione qui, dove sto ottenendo returnUrl come pagina richiesta originariamente. Questa richiesta originale può essere qualsiasi pagina nella mia applicazione. Quindi non posso semplicemente codificare il controller e l'azione in RedirectToAction(). C'è una possibilità per me di elaborare la parte Controller e Action da returnUrl usando tecniche di manipolazione delle stringhe (anche questo sarebbe molto difficile) ma stavo cercando un soluzione migliore – Jatin

+0

@Nirvan, invece di inviare una variabile stringa returnUrl invia 2 variabili che sono controller e azione. In questo modo è possibile creare l'URL richiesto. Se non provare a utilizzare un URL assoluto con Redirect come 'http: // yoursite.com/home/index'. –

+0

@Darain, Scusa se non sono stato molto chiaro sulle cose dell'autenticazione. L'autenticazione asp.net per impostazione predefinita tiene traccia di quale pagina è stata originariamente richiesta prima del login. Non compro personalmente il returnUrl. Ad esempio, supponiamo che l'utente tenti di accedere a/Home/Index prima di accedere. L'autenticazione di Asp.net entra e reindirizza alla pagina di accesso della mia applicazione. È qui che il server popola returnUrl come "/ Home/Index".Quindi vedi che ricevo solo una stringa (regurnUrl) nel mio controller di accesso che contiene l'url della pagina originariamente richiesta. – Jatin

2

Se sei bloccato sulla schermata di accesso STESSO dopo aver fornito credenziali di accesso valide, è possibile non è stato impostato il cookie di autenticazione Forms.

Ogni volta che si utilizza Redirect o RedirectToLocal nelle vostre actionmethods Login, assicuratevi di chiamare nel seguente ordine:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
return RedirectToLocal(returnUrl); 

Ciò assicura, il cookie viene impostato prima del reindirizzamento, in caso contrario il cliente tratterà come se l'utente non è collegato.

Grazie

Problemi correlati