Используйте кэшированные данные в фильтре действий, чтобы избежать повторного выполнения действия - PullRequest
5 голосов
/ 03 июня 2011

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

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

  • Если его нет в кэше, продолжите выполнение действия и достигните 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);     
}

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

С наилучшими пожеланиями.

Хосе.

1 Ответ

7 голосов
/ 03 июня 2011
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var model = filterContext.HttpContext.Cache["viewmodel"];
    if (model != null)
    {
        var result = new ViewResult();
        result.ViewData.Model = model;
        filterContext.Result = result;
    }
}
...