【问题标题】:Redirect(url) not working重定向(网址)不起作用
【发布时间】:2011-09-13 13:29:45
【问题描述】:

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

return Redirect(returnUrl);

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 首先感谢您详尽的回复。我这里没有使用 AJAX,所以我们可以排除您回复的第二部分。理想情况下,我想使用 RedirectToAction() 但我在这里使用身份验证,在这里我将 returnUrl 作为最初请求的页面。这个原始请求可以是我的应用程序中的任何页面。所以我不能只在 RedirectToAction() 中硬编码控制器和动作。我有一个选择可以使用字符串操作技术从 returnUrl 中计算出控制器和动作部分(即使那样会非常困难),但我正在寻找一个更好的解决方案。
    • @Nirvan,而不是发送 returnUrl 字符串变量,而是发送 2 个变量,它们是控制器和动作。这样您就可以构建所需的 url。如果不尝试使用带有重定向的绝对 URL,例如 http://yoursite.com/home/index
    • @Darain,对不起,我对身份验证的东西不是很清楚。默认情况下,asp.net 身份验证会跟踪登录之前最初请求的页面。我自己不填充returnUrl。例如,假设用户在登录之前尝试访问 /Home/Index。Asp.net 身份验证介入并重定向到我的应用程序的登录页面。这是服务器将 returnUrl 填充为“/Home/Index”的地方。所以你看到我在我的登录控制器中只得到一个字符串(regurnUrl),其中包含最初请求页面的 url。
    • @Nirvan,默认项目模板在登录操作中使用重定向,并且可以正常工作。也许问题出在您的代码的其他地方。
    • 即使我也这么认为。我将尝试检查我的代码,特别是关于授权。无论如何,我会在我的 upcomming 模块中使用重定向进行 AJAX 调用,所以我已经准备好解决方案,如您的第一个回复所示!谢谢你。
    【解决方案2】:

    如果您在提供有效的登录凭据后卡在相同的登录屏幕上,可能是您没有设置表单身份验证 cookie。

    每当您在登录操作方法中使用 Redirect 或 RedirectToLocal 时,请确保按以下顺序调用:

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

    这样可以确保在重定向之前设置 cookie,否则客户端将视为用户未登录。

    谢谢

    【讨论】:

      【解决方案3】:

      我在 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" }))

      有时创建这些模板的设计师会将功能与设计混合在一起,因此您必须注意这一点。

      【讨论】:

        【解决方案4】:

        @Nirvan,我遇到了同样的问题。经过深入研究,我意识到 mvc 模板附带的默认登录设置与我的登录设置冲突。我从来没有发现如何解决它,并决定重新启动我正在使用空白 mvc 项目的项目。(我不想使用 mycrosoft 完成的默认登录设置和代码)。 它工作顺利。 @Nirvan,如果您使用 mvc 模板,您的代码很可能没问题

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2017-11-13
        • 1970-01-01
        • 2018-12-12
        相关资源
        最近更新 更多