2011-08-25 87 views
1

我想創建一個拒絕訪問的ActinoResult從我的控制器返回。我有以下實施如何重定向到ASP.Net中的ActionResult路由MVC 3

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中編寫正確的重定向操作結果?

+0

評論http://msdn.microsoft.com/en-us/library/system.web.httpresponsewrapper.redirecttoroute.aspx有錯誤,但沒有解決方案。 – Jason

回答

4

您應該返回HttpUnauthorizedResult像這樣:此外

return new HttpUnauthorizedResult(); 

,你應該考慮創建一個派生自AuthorizeAttribute的新類來執行安全檢查。然後,您可以將此指令添加到您的web.config控制,其中客戶端定向:

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

最後,您可以添加自定義路徑來控制,當用戶被引導到〜/存取遭拒會發生什麼:

Route route = routes.MapRoute("AccessDeniedRoute", "AccessDenied", new { controller = "MyCustomErrorController", action = "My401Action" }); 
RouteTable.Routes.Add(route); 
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); 
    } 
}