【发布时间】:2011-09-13 13:29:45
【问题描述】:
在 ASP.net MVC3 的上下文中,我在控制器操作中有这行代码,它试图重定向到特定的 url。
return Redirect(returnUrl);
returnUrl 是一个包含“/Home/Index/”的字符串。由于某种原因,重定向没有发生,我仍然在同一个屏幕上。我尝试删除尾部斜杠但没有成功。任何想法为什么不发生重定向?
【问题讨论】:
在 ASP.net MVC3 的上下文中,我在控制器操作中有这行代码,它试图重定向到特定的 url。
return Redirect(returnUrl);
returnUrl 是一个包含“/Home/Index/”的字符串。由于某种原因,重定向没有发生,我仍然在同一个屏幕上。我尝试删除尾部斜杠但没有成功。任何想法为什么不发生重定向?
【问题讨论】:
Redirect 方法旨在用于重定向到您网站的外部 url,并通过向其传递绝对 url。如果您需要重定向到属于您的站点的另一个控制器操作,最好使用这个:
return RedirectToAction("Index", "Home");
通过这种方式,您不再需要对 url 进行硬编码,而且您的代码对路由更改的脆弱性也降低了。
话虽如此,如果您正在调用使用 AJAX 执行此重定向的控制器操作,您不能指望它将浏览器重定向到任何地方 => 它显然会停留在同一页面上。 AJAX 请求将在所有重定向之后成功,并且在成功回调中,您将获得 /Home/Index url 的最终 HTML,就像在没有 AJAX 的情况下请求它一样。
如果您想在 AJAX 调用的成功回调中重定向,您可以让控制器操作返回例如 JSON 对象,指示您要重定向到的目标 url:
return Json(new { redirectToUrl = Url.Action("Index", "Home") });
并在您的回调中使用window.location.href 函数:
success: function(result) {
window.location.href = result.redirectToUrl;
}
【讨论】:
http://yoursite.com/home/index。
如果您在提供有效的登录凭据后卡在相同的登录屏幕上,可能是您没有设置表单身份验证 cookie。
每当您在登录操作方法中使用 Redirect 或 RedirectToLocal 时,请确保按以下顺序调用:
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToLocal(returnUrl);
这样可以确保在重定向之前设置 cookie,否则客户端将视为用户未登录。
谢谢
【讨论】:
我在 MVC 5 中遇到了同样的问题,标准 login.cshtml 标记工作正常。我只是在为我购买的模板包含 html 标记时遇到问题。所以我所做的就是开始一点一点地替换 login.cshtml 代码。事实证明,问题是因为模板包含一个名为“rd-mailform”的 JQuery 插件,这导致了问题。
这不起作用:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class= "rd-mailform form-modern form-darker", role = “表格”}))
这很有效:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class= "form-modern form-darker", role = "form" }))
有时创建这些模板的设计师会将功能与设计混合在一起,因此您必须注意这一点。
【讨论】:
@Nirvan,我遇到了同样的问题。经过深入研究,我意识到 mvc 模板附带的默认登录设置与我的登录设置冲突。我从来没有发现如何解决它,并决定重新启动我正在使用空白 mvc 项目的项目。(我不想使用 mycrosoft 完成的默认登录设置和代码)。 它工作顺利。 @Nirvan,如果您使用 mvc 模板,您的代码很可能没问题
【讨论】: