簡體   English   中英

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

[英]How to redirect to a route in an ActionResult in 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中編寫正確的重定向動作結果?

你應該像這樣返回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);

也許你應該嘗試繼承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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM