2014-01-17 5 views
1

В MVCOutputCacheAttribute способен предотвратить выполнение действия его декорирования (если относительный кэш существует)Как может Атрибут предотвратить выполнение действия MVC?

Как реализовать тот же механизм, с помощью пользовательского атрибута?

В других работах я хотел бы иметь возможность украсить действие и на основе логики, внутренней для атрибута, будет решать, должно ли действие выполняться или нет.

Дополнение

Я реализовал механизм, с помощью которого, если запрос к действию приходит с строкой запросом, как flushaction=flush_silent, пользовательский атрибут (который расширяет OutputCacheAttribute) отменяет кэш.

То, что я хотел бы сделать, не выполнить действие:

[JHOutputCache(CacheProfile = "ContentPageController.Index")] 
public ActionResult Index(string url) 
{ 
    //custom code that should not execute when flushing the cache 
} 

ответ

2

Как JHOutputCache проходит OutputCacheAttribute, который вытекает из ActionFilterAttribute, останавливая выполнение основного действия довольно прост:

public class JHOutputCacheAttribute : OutputCacheAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (condition) 
      filterContext.Result = new EmptyResult(); 
     else 
      base.OnActionExecuting(filterContext); 
    } 
} 

Здесь вы можете вернуть любые действительные ActionResult, включая любые изготовленные на заказ ActionResult, которые вы, возможно, получили.

+1

Именно то, что я искал! :) –

+0

У меня другая проблема, проблема в том, что фактический запрос с 'flushaction = flush_silent' получает кеширование и он не будет выполняться во второй раз. Вы знаете, как предотвратить его кэширование из самого атрибута? Я могу настроить другой вопрос, если это проще. –

+0

@ GiuseppeR Немного сложно сказать, что вы пытаетесь сделать, но это звучит как [VaryByParam] (http://msdn.microsoft.com/en-us/library/hdxfb6cy%28v=vs.85% 29.aspx) может быть то, что вам нужно посмотреть. –