ASP.NET MVC:重定向到MVC中的页面/动作的正确方法是什么?

Mar*_*man 28 c# asp.net-mvc redirect

我对MVC很新,但不确定究竟哪个Redirect ...替换了WebForms中使用的标准重定向,即标准 Response.Redirect()

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

1)当用户注销时(表单在操作中注销)我想重定向到登录页面.

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

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

更新:

这个问题的答案(System.Web.Mvc.Controller Initialize)表明Initialize不应该使用并且OnActionExecuting应该使用?

对于为什么Initialize不应该使用或为什么OnAuthorization不是更好的选择的任何评论?

更多信息:

此博客文章(http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/)表示OnActionExecuting对身份验证很有用(如上面的链接所示)我想将此添加到该事件在基类Controller类中很好,因为每个页面都在MVC中运行一个Action,所以不应该有很大的不同,并且具有重定向的能力应该更容易.这确实有意义,但对我来说似乎也有意义,事情可以在事件发生前的事件中完成,并让我们质疑这些事件的用途是什么?将OnActionExecuting要去...

Jim*_*mmy 26

1)当用户注销时(表单注销操作)我想重定向到登录页面.

public ActionResult Logout() {
    //log out the user
    return RedirectToAction("Login");
}
Run Code Online (Sandbox Code Playgroud)

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

为什么要从控制器init重定向?

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

public ActionResult Index() {
    return RedirectToAction("whateverAction", "whateverController");
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能想要查看MVC区域,这是MVC 2的一项新功能,它允许您将应用程序拆分为不同的部分,这可能有助于解决您的用例 (2认同)

Art*_*aru 5

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

2)您应该只在常规情况下使用RedirectToAction(“ action”,“ controller”)。您想在Initialize方法旁边进行重定向吗?为什么?我不知道您为什么会这样做,在大多数情况下,您应该查看imo方法。如果您想进行身份验证,那么这肯定是错误的方式(极少有发生异常情况的机会)[Authorize]而是您的控制器或方法上的属性:)

UPD: 如果您在Initialize方法中进行了一些安全检查,并且用户没有访问此方法的权限,则可以执行以下两项操作:

Response.StatusCode = 403;
Response.End();
Run Code Online (Sandbox Code Playgroud)

这会将用户发送回登录页面。如果您想将他发送到自定义位置,则可以执行以下操作(注意:伪代码)

Response.Redirect(Url.Action("action", "controller"));
Run Code Online (Sandbox Code Playgroud)

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

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString());
Run Code Online (Sandbox Code Playgroud)