从操作filter属性redirect
在ActionFilterAttribute
做redirect的最好方法是什么? 我有一个名为IsAuthenticatedAttributeFilter
的ActionFilterAttribute
并检查了会话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屏幕。
扩展AuthorizeAttribute
说CutomAuthorizer
重写OnAuthorization
和HandleUnauthorizedRequest
在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
- S3静态网站托pipepath到Index.html的所有path
- laravel 4除家外的所有路由导致404错误
- Rails:你如何访问RESTful助手?
- 如何在rspec中编写Rails 3.1引擎控制器testing?
- Laravel – 对所有路由使用(:any?)通配符?
- 客户端路由(使用react-router)和服务器端路由
- Web API路由 – api / {controller} / {action} / {id}“function障碍”api / {controller} / {id}
- AngularJS – 我如何做一个完整的页面加载redirect?
- devise自定义路线和login页面