从操作filter属性redirect

ActionFilterAttribute做redirect的最好方法是什么? 我有一个名为IsAuthenticatedAttributeFilterActionFilterAttribute并检查了会话variables的值。 如果该variables为false,我希望应用程序redirect到login页面。 我宁愿redirect使用路由名称SystemLogin但是在这一点的任何redirect方法将罚款。

设置filterContext.Result

路线名称:

 filterContext.Result = new RedirectToRouteResult("SystemLogin", routeValues); 

你也可以做这样的事情:

 filterContext.Result = new ViewResult { ViewName = SharedViews.SessionLost, ViewData = filterContext.Controller.ViewData }; 

如果你想使用RedirectToAction

你可以在你的控制器( 最好在它的基本控制器上build立一个公共的RedirectToAction方法, 只需从System.Web.Mvc.Controller调用受保护的RedirectToAction 。 添加此方法允许从filter公开呼叫您的 RedirectToAction

 public new RedirectToRouteResult RedirectToAction(string action, string controller) { return base.RedirectToAction(action, controller); } 

那么你的filter看起来像这样:

 public override void OnActionExecuting(ActionExecutingContext filterContext) { var controller = (SomeControllerBase) filterContext.Controller; filterContext.Result = controller.RedirectToAction("index", "home"); } 

或者redirect,如果它正在调用你自己的代码,你可以使用这个:

 actionContext.Result = new RedirectToRouteResult( new RouteValueDictionary(new { controller = "Home", action = "Error" }) ); actionContext.Result.ExecuteResult(actionContext.Controller.ControllerContext); 

这不是一个纯粹的redirect,但给出了一个类似的结果没有不必要的开销。

我正在使用MVC4,我使用下面的方法redirect违反授权的自定义HTML屏幕。

扩展AuthorizeAttributeCutomAuthorizer重写OnAuthorizationHandleUnauthorizedRequest

在RegisterGlobalFilters中注册CustomAuthorizer

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomAuthorizer()); } 

一旦识别出unAuthorized访问呼叫HandleUnauthorizedRequest并redirect到相关的控制器操作,如下所示。


 public class CustomAuthorizer : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { bool isAuthorized = IsAuthorized(filterContext); // check authorization base.OnAuthorization(filterContext); if (!isAuthorized && !filterContext.ActionDescriptor.ActionName.Equals("Unauthorized", StringComparison.InvariantCultureIgnoreCase) && !filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.Equals("LogOn", StringComparison.InvariantCultureIgnoreCase)) { HandleUnauthorizedRequest(filterContext); } } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary{{ "controller", "LogOn" }, { "action", "Unauthorized" } }); } } 

这听起来像是你想重新实现,或者可能扩展AuthorizeAttribute 。 如果是这样,你应该确保你inheritance了那个,而不是ActionFilterAttribute ,以便让ASP.NET MVC为你做更多的工作。

另外,您还要确保在执行操作方法中的任何实际工作之前进行授权 – 否则,login和不login之间的唯一区别将是工作完成后显示的页面。

 public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { // Do whatever checking you need here // If you want the base check as well (against users/roles) call base.OnAuthorization(filterContext); } } 

有一个很好的问题 ,在这里有关于更多细节的答案 。

尝试下面的代码片断,应该很清楚:

 public class AuthorizeActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(FilterExecutingContext filterContext) { HttpSessionStateBase session = filterContext.HttpContext.Session; Controller controller = filterContext.Controller as Controller; if (controller != null) { if (session["Login"] == null) { filterContext.Cancel = true; controller.HttpContext.Response.Redirect("./Login"); } } base.OnActionExecuting(filterContext); } } 

你可以inheritance你的控制器,然后在你的动作filter中使用它

在你的ActionFilterAttribute类中:

  if( filterContext.Controller is MyController ) if(filterContext.HttpContext.Session["login"] == null) (filterContext.Controller as MyController).RedirectToAction("Login"); 

在您的基地控制器内:

 public class MyController : Controller { public void RedirectToAction(string actionName) { base.RedirectToAction(actionName); } } 

缺点。 这是将所有控制器从“MyController”类inheritance