重定向(url)不工作

问题描述:

在ASP.net MVC3的上下文中,我在控制器操作中有这一行代码,它试图重定向到一个特定的url。重定向(url)不工作

return Redirect(returnUrl); 

returnUrl是一个包含“/ Home/Index /”的字符串。出于某种原因,重定向不在发生,我仍然在同一个屏幕上。我试图删除后面的斜线,但没有成功。任何想法为什么重定向不会发生?

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

如果要提供有效的登录凭据后停留在同一个登录界面,有可能你没有设置窗体身份验证cookie。

当你使用重定向或RedirectToLocal在您登录actionmethods,请务必按以下顺序拨打:

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

这保证,cookie将被重定向之前设置,否则客户端会当作如果用户没有登录。

谢谢