2011-09-13 156 views
5

在ASP.net MVC3的上下文中,我在控制器操作中有這一行代碼,它試圖重定向到一個特定的url。重定向(url)不工作

return Redirect(returnUrl); 

returnUrl是一個包含「/ Home/Index /」的字符串。出於某種原因,重定向不在發生,我仍然在同一個屏幕上。我試圖刪除後面的斜線,但沒有成功。任何想法爲什麼重定向不會發生?

回答

13

Redirect方法旨在用於重定向到您網站的外部URL並通過傳遞絕對URL。如果您需要重定向到屬於您網站上另一個控制器動作,將是更好的使用:

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

這樣,你不再硬編碼URL和你的代碼是路由變化不那麼脆弱。

這就是說,如果你正在調用控制器動作來執行這個AJAX重定向,你不能指望它在任何地方重定向瀏覽器=>它顯然會停留在同一頁面上。在所有重定向之後,AJAX請求將成功,並且在成功回調中,您將獲得最終的/Home/Index網址的HTML,就像在沒有AJAX的情況下請求一樣。

如果你想在一個AJAX的成功回調重定向叫你可以有例如您的控制器動作返回指示要重定向到目標URL一個JSON對象:

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

,並在回調使用window.location.href功能:

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

首先感謝您的詳盡答覆。我沒有在這裏使用AJAX,所以我們可以排除你的回覆的第二部分。理想情況下,我想使用RedirectToAction(),但我在這裏使用Authentication,在那裏我將returnUrl作爲最初請求的頁面。這個原始請求可以是我的應用程序中的任何頁面。所以我不能在RedirectToAction()中硬編碼控制器和動作。我有一種方法可以使用字符串操作技術從returnUrl中制定控制器和動作部分(即使這很難),但我一直在尋找解決方案更好 – Jatin

+0

@Nirvan,而不是發送一個returnUrl字符串變量發送2個變量,它們是控制器和動作。這樣你可以建立所需的網址。如果不嘗試使用像'http:// yoursite.com/home/index'這樣的重定向的絕對網址。 –

+0

@Darain,對不起,我對認證內容不是很清楚。默認情況下,asp.net認證會記錄登錄前最初請求的頁面。我自己不填充returnUrl。例如,假設用戶在登錄前嘗試訪問/ Home/Index。Asp.net認證步入並重定向到我的應用程序的登錄頁面。這是服務器將returnUrl填充爲「/ Home/Index」的地方。所以你看到我的登錄控制器中只有一個字符串(regurnUrl),它包含了最初請求的頁面的URL。 – Jatin

2

如果要提供有效的登錄憑據後停留在同一個登錄界面,有可能你沒有設置窗體身份驗證cookie。

當你使用重定向或RedirectToLocal在您登錄actionmethods,請務必按以下順序撥打:

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

這保證,cookie將被重定向之前設置,否則客戶端會當作如果用戶沒有登錄。

謝謝