【问题标题】:ASP.NET MVC: What is the correct way to redirect to pages/actions in MVC?ASP.NET MVC:重定向到 MVC 中的页面/操作的正确方法是什么?
【发布时间】:2011-02-10 05:57:55
【问题描述】:

我对 MVC 还很陌生,但不确定哪个重定向...替换 WebForms 中使用的标准重定向是标准 Response.Redirect()

例如,我需要在几个场景中重定向到其他页面:

  1. 当用户注销时(Forms signout in Action)我想重定向到登录页面。
  2. 在控制器或基本控制器事件中,例如Initialize,我想重定向到另一个页面(AbsoluteRootUrl + Controller + Action

似乎在某些情况下调用了多个重定向会导致错误,这与页面已经被重定向的事实有关吗?如何取消当前请求并重定向?

更新:

这个问题的答案(System.Web.Mvc.Controller Initialize)表示不应该使用Initialize,应该使用OnActionExecuting

关于为什么不应使用 Initialize 或为什么 OnAuthorization 不是更好的选择的任何 cmets?

更多信息:

这篇博文 (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) 表明 OnActionExecuting 对身份验证很有用(如上面的链接所示)我想将其添加到基本 Controller 类中的该事件中很好,因为每个页面都在 MVC 中运行一个 Action所以不应该有太大的区别,并且具有重定向的能力应该更容易。这确实是有道理的,但对我来说似乎也有道理,事情可以在这个事件之前的一个事件中完成,并让我们质疑这些事件是为了什么?将给予OnActionExecuting 一个机会..

【问题讨论】:

  • 你提到的这个基本控制器初始化事件是什么?
  • @Mahesh Velaga:我有覆盖初始化事件的基本控制器,即受保护的覆盖 void Initialize(System.Web.Routing.RequestContext requestContext)...我有一些安全检查,需要重定向基于这些检查的用户
  • 为什么不在 tempdata 或 viewdata 中设置一些值,当您根据可以使用 RedirectToAction 重定向的值到达控制器操作时?
  • 我希望在基类中有这个,而不必在每个控制器的每个操作中实现重定向...

标签: c# asp.net-mvc redirect


【解决方案1】:

1) 当用户退出时(表单退出操作)我想重定向到登录页面。

public ActionResult Logout() {
    //log out the user
    return RedirectToAction("Login");
}

2) 在 Controller 或基本 Controller 事件中,例如 Initialze,我想重定向到另一个页面(AbsoluteRootUrl + Controller + Action)

为什么要从控制器初始化重定向?

路由引擎会自动处理传入的请求,如果您想从控制器上的索引操作重定向,只需执行以下操作:

public ActionResult Index() {
    return RedirectToAction("whateverAction", "whateverController");
}

【讨论】:

  • 可能要注意第一项在 Account 控制器中。
  • 我还是觉得应该使用FormsAuthentication.RedirectToLoginPage()而不是return RedirectToAction("Login");
  • 控制器初始化事件正在检测多租户的子域,检测子域更改并基于此检查用户身份验证。
  • 您可能想研究 MVC 区域,这是 MVC 2 的一个新功能,它允许您将应用程序分成不同的部分,这可能有助于解决您的用例
  • @Artiom,FormsAuthentication.RedirectToLoginPage() 不会清除用户身份验证会话,为什么在显然不是预期结果的情况下使用它?
【解决方案2】:

1) 要从登录页面重定向到登录页面/,请不要使用 Redirect() 方法。使用FormsAuthentication.RedirectToLoginPage()FormsAuthentication.RedirectFromLoginPage()

2) 你应该只在常规场景中使用 RedirectToAction("action", "controller") .. 您想在 Initialize 方法中重定向吗?为什么?我不明白您为什么要这样做,并且在大多数情况下,您应该查看您的方法 imo .. 如果您想这样做以进行身份​​验证,这绝对是错误的方式(几乎没有机会遇到例外) 请改用控制器或方法上的[Authorize] 属性:)

统一更新: 如果您在 Initialise 方法中进行了一些安全检查,并且用户无权访问此方法,您可以执行以下操作: 一)

Response.StatusCode = 403;
Response.End();

这会将用户返回到登录页面。 如果你想把他送到自定义位置,你可以这样做(注意:伪代码)

Response.Redirect(Url.Action("action", "controller"));

无需指定完整的网址。这应该足够了。 如果你完全坚持完整的网址:

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString());

【讨论】:

  • 有一个身份验证检查,但更多的是在多租户应用程序中检查用户和租户,并完成其他安全检查。如果存在违规行为,则应将用户注销并重定向到某个地方(这可能是通用登录、特定登录、主页或其他页面)
  • 嗯.. 我的回答似乎涵盖了这一点,不是吗?除非我错过了什么,否则我很乐意提供帮助)
  • 重定向似乎根本无法从初始化开始,所以重新考虑...添加更多信息来提问...
  • 尝试 Response.Redirect(url, true) 或在重定向后运行 Response.End() ..这应该强制重定向“NOW”:)
  • 在 Response.Redirect(url, true) 中将 endResponse 参数设置为 true 似乎也不起作用。该页面完成了它的往返行程,但 ViewData/Model 数据丢失了。将尝试将代码移动到 OnActionExecuting 事件。
【解决方案3】:
RedirectToAction("actionName", "controllerName");

它还有其他重载,请检查!

另外,如果你是新手并且没有使用T4MVC,那么我建议你使用它!

它为您提供动作、控制器、视图等的智能(不再有魔术字符串)

【讨论】:

  • 这对数字 1 有好处,但您在数字 2 中没有。
  • 确实,在第 2 种情况下,RedirectToAction 似乎被忽略了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多