2011-09-13 15 views
5

W kontekście ASP.net MVC3, mam ten wiersz kodu w akcji kontrolera, który próbuje przekierować do konkretnego adresu URL.Przekierowanie (URL) nie działa

return Redirect(returnUrl); 

returnUrl jest ciągiem zawierającym "/ Home/Index /". Z jakiegoś powodu przekierowanie nie ma miejsca i pozostaję na tym samym ekranie. Próbowałem usunąć końcowe ukośniki, ale bez powodzenia. Wszelkie pomysły, dlaczego przekierowanie nie ma miejsca?

Odpowiedz

13

Metoda Redirect służy do przekierowania na zewnętrzne adresy URL witryny i podania absolutnego adresu URL. Jeśli trzeba przekierować do innego działania kontrolera, która należy do witryny lepiej byłoby użyć to:

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

ten sposób nie są już sztywno adresy URL i kod jest mniej kruchy zmiany trasy.

Mówiąc to, jeśli wywołujesz akcję kontrolera, która wykonuje to przekierowanie z AJAX, nie możesz oczekiwać, że przekieruje przeglądarkę w dowolnym miejscu => oczywiście pozostanie na tej samej stronie. Żądanie AJAX powiedzie się po wszystkich przekierowaniach, a w powodzeniu oddziałań otrzymasz końcowy kod HTML adresu URL /Home/Index, tak jakby był żądany bez AJAX.

Jeśli chcesz przekierować w zwrotnego sukcesu AJAX zadzwonić mogłeś zwrot akcji kontrolera na przykład obiekt JSON wskazuje docelowy adres URL, który chcesz przekierować do:

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

iw swoim zwrotnego użyj window.location.href funkcję:

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

Przede wszystkim dzięki za wyczerpującą odpowiedź. Nie używam tutaj AJAX, więc możemy wykluczyć drugą część Twojej odpowiedzi. Idealnie chciałbym użyć RedirectToAction(), ale używam tutaj uwierzytelniania, gdzie otrzymuję returnUrl jako pierwotnie żądaną stronę. To oryginalne żądanie może być dowolną stroną w mojej aplikacji. Więc nie mogę po prostu zakodować kontrolera i akcji w RedirectToAction() Jest jedna opcja dla mnie, aby opracować kontroler i część Action z returnUrl za pomocą technik manipulacji ciągami (nawet, że byłoby to bardzo trudne), ale szukałem lepsze rozwiązanie. – Jatin

+0

@Nirvan, zamiast wysyłać zmienną ciągową returnUrl wyślij 2 zmienne będące kontrolerem i akcją. W ten sposób możesz zbudować wymagany adres URL. Jeśli nie, spróbuj użyć bezwzględnego adresu URL z przekierowaniem, np. 'Http: // twojastrona.com/home/index'. –

+0

@Darain, przepraszam, że nie bardzo wiedziałem o uwierzytelnianiu. Uwierzytelnianie asp.net domyślnie śledzi, która strona była pierwotnie wymagana przed zalogowaniem. Sam nie zapełniam returnUrl. Załóżmy na przykład, że użytkownik próbuje uzyskać dostęp do/Home/Index przed zalogowaniem. Uwierzytelnianie Asp.net wprowadza i przekierowuje do strony logowania mojej aplikacji. W tym miejscu serwer zapełnia wartość returnUrl jako "/ Home/Index".Widzisz więc, że w moim kontrolerze logowania znajduje się tylko ciąg (regurnUrl), który zawiera adres URL pierwotnie żądanej strony. – Jatin

2

Jeśli utkniesz na tej samej Ekran logowania po dostarczeniu prawidłowymi poświadczeniami logowania, możliwe jest, że nie został ustawiony plik cookie uwierzytelniania formularzy.

Gdy używasz przekierowanie lub RedirectToLocal w loginu actionmethods, upewnij się, że nazywają się w następującej kolejności:

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

Gwarantuje to, plik cookie jest ustawiony przed przekierowaniem, w przeciwnym razie klient będzie traktował tak, jakby użytkownik nie jest zalogowany.

Dzięki

Powiązane problemy