RedirectResult到共享视图

时间:2018-04-18 12:56:52

标签: c# asp.net-mvc

我重写了authorize属性,我想知道是否可以通过RedirectResult将用户重定向到共享错误视图?

public override void OnAuthorization(AuthorizationContext filterContext)
{
    // if failed
    filterContext.Result = new RedirectResult("~/Shared/NotAuthorized.cshtml");

    base.OnAuthorization(filterContext);

}

或者我是否必须创建错误控制器?如何编写字符串url以便在本地测试并发布到Web服务器时可以正常工作?

1 个答案:

答案 0 :(得分:0)

你可以将它封装在它自己的属性中,就像这个

一样
public class HandleUnauthorizedAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        if (filterContext.Exception.GetType() != typeof (SecurityException)) return;

        var controllerName = (string) filterContext.RouteData.Values["controller"];
        var actionName = (string) filterContext.RouteData.Values["action"];
        var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

        filterContext.Result = new ViewResult
        {
            ViewName = "Unauthorized",
            ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
            TempData = filterContext.Controller.TempData
        };
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 403;
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }
}

因为如果授权失败,授权将抛出SecurityException。

然后在全局处理程序中注册它。无需控制器。

如果您不想使用单独的属性路由,则可以随时取出filterContext.Result代码并将其粘贴到OnAuthorize()方法中。