在WebForm中,我们可以在MasterPage.cs中编写一个方法,并在每个请求中运行 e.g:
MasterPage.cs
--------------
protected void Page_Load(object sender, EventArgs e)
{
CheckCookie();
}
我们如何在MVC中做这样的事情?
答案 0 :(得分:89)
在ASP.NET MVC中,您可以编写custom global action filter。
更新:
根据评论部分的要求,此处的过滤器可能如下所示:
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var fooCookie = filterContext.HttpContext.Request.Cookies["foo"];
// TODO: do something with the foo cookie
}
}
如果您想根据cookie的值执行授权,那么实现IAuthorizationFilter接口会更正确:
public class MyActionFilterAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var fooCookie = filterContext.HttpContext.Request.Cookies["foo"];
if (fooCookie == null || fooCookie.Value != "foo bar")
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
如果您希望此操作过滤器针对每个控制器操作的每个请求运行,您可以在RegisterGlobalFilters
方法的global.asax中将其注册为全局操作过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new MyActionFilterAttribute());
}
如果您只需要执行特定操作或控制器,只需使用以下属性进行装饰:
[MyActionFilter]
public ActionResult SomeAction()
{
...
}
答案 1 :(得分:7)
您可以使用Global.asax Application_AcquireRequestState
方法,该方法将在每个请求中被调用:
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
//...
}