Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run a method in each request in MVC, C#?

In WebForm we could write a method in MasterPage.cs and it ran in each request .
e.g:

MasterPage.cs -------------- protected void Page_Load(object sender, EventArgs e) {    CheckCookie(); } 

How can we do something like this in MVC ?

like image 590
Mohammad Dayyan Avatar asked Mar 01 '12 06:03

Mohammad Dayyan


People also ask

Can one action method have multiple views?

Yes, completely possible. And, it can be multiple views, or even a FileResult or other result type.


1 Answers

In ASP.NET MVC you could write a custom global action filter.


UPDATE:

As requested in the comments section here's an example of how such filter might look like:

public class MyActionFilterAttribute : ActionFilterAttribute {     public override void OnActionExecuting(ActionExecutingContext filterContext)     {         var fooCookie = filterContext.HttpContext.Request.Cookies["foo"];         // TODO: do something with the foo cookie     } } 

If you want to perform authorization based on the value of the cookie, it would be more correct to implement the IAuthorizationFilter interface:

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();         }     } } 

If you want this action filter to run on each request for each controller action you could register it as a global action filter in your global.asax in the RegisterGlobalFilters method:

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

And if you need this to execute only for particular actions or controllers simply decorate them with this attribute:

[MyActionFilter] public ActionResult SomeAction() {     ... } 
like image 178
Darin Dimitrov Avatar answered Oct 06 '22 01:10

Darin Dimitrov