2013-02-26 59 views
3

道歉,如果这是显而易见的,但我想做一个属性,处理在部分视图中使用的模型的缓存。OnActionExecuting构造局部视图

[MyCache(typeof(MyModel))] 
    public ActionResult MyAction(string fooId) 
    { 
     return PartialView(new MyModel()); 
    } 

我的属性应该是在输入模型上更新缓存,并覆盖在缓存模型中得到的动作结果。

但是我不知道如何从控制器外部调用PartialView方法。此构造函数似乎没有任何参数:

new PartialViewResult(filterContext.HttpContext.Cache.Get("MyModelCache")[model.Name]); 

如何使用剃须刀视图构建模型?谢谢。

回答

3
filterContext.Controller.ViewData.Model = 
    filterContext.HttpContext.Cache.Get("MyModelCache")[model.Name]; 
filterContext.Result = new PartialViewResult 
{ 
    ViewData = filterContext.Controller.ViewData, 
    ViewName = "~/Views/_NameOfPartial", // optional if you need it 
}; 

这里是PartialView法源的控制器,需要两个参数:

namespace System.Web.Mvc 
{ 
    public abstract class Controller : ControllerBase, (etc) 
    { 
     ... 
     protected internal virtual PartialViewResult PartialView(
      string viewName, object model) 
     { 
      if (model != null) 
       this.ViewData.Model = model; 
      PartialViewResult partialViewResult = new PartialViewResult(); 
      partialViewResult.ViewName = viewName; 
      partialViewResult.ViewData = this.ViewData; 
      partialViewResult.TempData = this.TempData; 
      partialViewResult.ViewEngineCollection = this.ViewEngineCollection; 
      return partialViewResult; 
     } 
     ... 
    } 
} 
+0

感谢您的更完整的答案!是不是需要tempdata和ViewEngineCollection呢? – Tim 2013-02-27 10:29:23

+0

除非您的部分视图使用tempdata或需要自定义视图引擎,否则不应该需要。 – danludwig 2013-02-27 12:31:38

2

试试这个

new PartialViewResult 
{ 
    ViewData = new ViewDataDictionary(filterContext.HttpContext.Cache.Get("MyModelCache"))[model.Name], 
}