Используйте кэшированные данные в фильтре действий, чтобы избежать повторного выполнения действия.

Я хотел бы сделать следующее (я разделю на два пункта):

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

  • Если его нет в кеше, продолжите выполнение действия и дойдите до OnActionExecuted, чтобы поместить модель представления в кеш.

Как я могу вернуть представление и модель представления без выполнения действия (первая точка)?

Это код. Мое сомнение обозначено ?????????:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
   //IF the viewmodel exists dont execute the action again
   if (filterContext.HttpContext.Cache["viewmodel"]!=null)
   {
      filterContext.Result=???????
   }
   base.OnActionExecuting(filterContext);
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    //Cast de model
    ContentDetailVM model = (ContentDetailVM)filterContext.Controller.ViewData.Model;
    filterContext.HttpContext.Cache.Insert("viewmodel", model);
    //we're asking for a close section
    if (model.CurrentSection.HideAccess == true)
    {
         //pass to the client some flag in order to show the div
         filterContext.Controller.ViewData["showoverlaylayer"]=true;
    }
    base.OnActionExecuted(filterContext);     
}

Заранее большое спасибо.

С уважением.

Хосе.


person Jose3d    schedule 03.06.2011    source источник


Ответы (1)


person    schedule
comment
Один вопрос, я получаю сообщение об ошибке, потому что я использую главную страницу. Знаете ли вы, нужно ли мне назначать дополнительные свойства ViewResult, который я создаю? Большое спасибо. - person Jose3d; 03.06.2011
comment
Очевидно, проблема более сложная... Дело в том, что этот фильтр действий предназначен для одного виджета, который находится внутри другой страницы (с использованием действия рендеринга), и эта страница находится в мастере. Я думаю, мне нужно установить не только мастер, но и страницу, на которой этот виджет включен, и т. д. Спасибо. - person Jose3d; 03.06.2011
comment
@ Jose3d, да, тогда это сложнее :-) Кстати, вы рассматривали возможность использования атрибута [OutputCache]? - person Darin Dimitrov; 03.06.2011
comment
Привет, Дарин, [OutputCache] недостаточно, в моем случае вид виджета меняется в зависимости от свойств модели и некоторых вещей, связанных с безопасностью. В любом случае, я решил это, немного изменив код, который вы мне дали, просто выполните var result=new PartialViewResult(), и это сработало. Спасибо за все отличные советы! - person Jose3d; 03.06.2011
comment
@DarinDimitrov Привет, Дарин, я много звонил внутри ACtionFilterAttribute. Могу ли я кэшировать их в asp.net - person Anirudha Gupta; 23.05.2013