2012-03-01 2 views
43

В WebForm мы могли написать метод в MasterPage.cs, и он выполнялся в каждом запросе.
например:Выполнить метод в каждом запросе в MVC, C#?

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

Как мы можем сделать что-то подобное в MVC?

+1

Может быть, это http://stackoverflow.com/questions/2650269/how-do-i-get-certain-code-to-execute-before- каждый-один-контроллер-action-in-as – V4Vendetta

+1

Вы хотите поместить ActionFilterAttribute на контроллер –

+0

Я бы тоже посмотрите, что делает этот метод, и если он еще нужен в MVC, нет смысла переносить то, что новая технология делает устаревшей. – TheRealTy

ответ

80

В ASP.NET MVC можно написать custom global action filter.


UPDATE:

В соответствии с просьбой в разделе комментариев здесь приведен пример того, как такой фильтр может выглядеть следующим образом:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var fooCookie = filterContext.HttpContext.Request.Cookies["foo"]; 
     // TODO: do something with the foo 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(); 
     } 
    } 
} 

Если вы хотите, чтобы это действие фильтра для выполнения каждого запроса для каждого действия контроллера вы можете зарегистрировать его в качестве глобального фильтра действия в вашем global.asax в методе RegisterGlobalFilters:

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

И если вам это нужно выполнить только для конкретных действий или контроллеров просто украсить их с этим атрибутом:

[MyActionFilter] 
public ActionResult SomeAction() 
{ 
    ... 
} 
+0

Не могли бы вы написать образец для этого? –

+0

@Mohammad, конечно, мне показалось, что вы прочитали статью, с которой я связался в своем ответе, и попытались реализовать пример кода, показанный там. По-видимому, я ошибался, думая об этом. Поэтому я обновил свой ответ, чтобы показать пример. –

+0

Спасибо, чувак, но вопрос. как мы можем перенаправить на действие в MyActionFilterAttribute? –

6

Вы можете использовать Global.asax Application_AcquireRequestState метод, который будет вызываться при каждом запросе:

protected void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    //... 
} 
+2

Итак, можем ли мы получить доступ к методу Cookie и Session из выше? –

+1

Да, вы можете. но этот метод может выполнять более одного запроса. –

Смежные вопросы