如何在ASP.Net MVC 3中重定向到ActionResult中的路由

时间:2011-08-25 20:36:59

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

我正在尝试创建一个拒绝ActinoResult的访问权限,以便从我的控制器返回。我有以下实现

public class AccessDeniedResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (null != context && null != context.HttpContext && null != context.HttpContext.Response)
        {
            context.HttpContext.Response.StatusCode = 401;
            context.HttpContext.Response.RedirectToRoute("AccessDenied");
        }
    }
}

这不起作用,因为来自HttpResponseBase的NotImplementedException作为context.HttpContext.Response传递。

如何在MVC3中编写正确的重定向动作结果?

2 个答案:

答案 0 :(得分:4)

你应该像这样返回HttpUnauthorizedResult:

return new HttpUnauthorizedResult();

此外,您应该考虑创建一个派生自AuthorizeAttribute的新类来进行安全检查。然后,您可以将此指令添加到web.config以控制客户端的定向位置:

<customErrors mode="On" defaultRedirect="~/Home/Error">
    <error statusCode="401" redirect="~/AccessDenied" />
</customErrors>

最后,您可以添加自定义路由来控制将用户定向到〜/ AccessDenied时发生的情况:

Route route = routes.MapRoute("AccessDeniedRoute", "AccessDenied", new { controller = "MyCustomErrorController", action = "My401Action" });
RouteTable.Routes.Add(route);

答案 1 :(得分:0)

也许您应该尝试继承RedirectToRouteResult(继承ActionResult)。

您还可以查看该类的源代码,了解它们是如何完成的:

public override void ExecuteResult(ControllerContext context) {
    if (context == null) {
        throw new ArgumentNullException("context");
    }
    if (context.IsChildAction) {
        throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
    }

    string destinationUrl = UrlHelper.GenerateUrl(RouteName, null /* actionName */, null /* controllerName */, RouteValues, Routes, context.RequestContext, false /* includeImplicitMvcValues */);
    if (String.IsNullOrEmpty(destinationUrl)) {
        throw new InvalidOperationException(MvcResources.Common_NoRouteMatched);
    }

    context.Controller.TempData.Keep();

    if (Permanent) {
        context.HttpContext.Response.RedirectPermanent(destinationUrl, endResponse: false);
    }
    else {
        context.HttpContext.Response.Redirect(destinationUrl, endResponse: false);
    }
}