如何在MVC5,C#中的PartialView控制器中使用OutputCache?
我的控制器具有如何在MVC5,C#中的PartialView控制器中使用OutputCache?,c#,asp.net-mvc,outputcache,C#,Asp.net Mvc,Outputcache,我的控制器具有PartialViewResult或JsonResult返回类型。 我想用[OutputCache]缓存它,但它根本不起作用,并且总是使用以下索引控制器线程.Sleep(5000)运行 [HttpPost] [ValidateAntiForgeryToken] [OutputCache(Duration = 120, Location = OutputCacheLocation.Server)] public ActionResult Index(DevicesAjaxViewMo
PartialViewResult
或JsonResult
返回类型。我想用
[OutputCache]
缓存它,但它根本不起作用,并且总是使用以下索引
控制器线程.Sleep(5000)代码>运行
[HttpPost]
[ValidateAntiForgeryToken]
[OutputCache(Duration = 120, Location = OutputCacheLocation.Server)]
public ActionResult Index(DevicesAjaxViewModel viewModel)
{
try
{
//Response.Cache.SetExpires(DateTime.Now.AddSeconds(30));
//Response.Cache.SetCacheability(HttpCacheability.Server);
Response.Cache.AddValidationCallback(IsCacheValid, Request.UserAgent);
#if DEBUG
Thread.Sleep(5000);
#endif
if (!ModelState.IsValid) return Json(new ModelError("Error in Model"));
var allObjects = _objectService.GetAllObjects();
string objectName = allObjects.First(q => q.Id == viewModel.ObjectId).Name;
KeyValuePair<int, List<DeviceModel>> keyValuePair = ApplyFiltering(objectName, viewModel.PageNumber, false, viewModel.Filtering);
FilteringDevicesResultModel filteringDevicesResultModel = new FilteringDevicesResultModel
{
Devices = keyValuePair.Value,
FoundDevicesCount = keyValuePair.Key.ToMoneyFormat(),
RequestId = viewModel.RequestId
};
return PartialView("~/Views/Partials/DevicesPagePartial.cshtml", filteringDevicesResultModel);
}
catch (Exception ex)
{
return Json(new ModelError(ex.Message));
}
}
void IsCacheValid(HttpContext httpContext, object data, ref HttpValidationStatus status)
{
if (true)
status = HttpValidationStatus.Valid;
else
status = HttpValidationStatus.Invalid;
}
[HttpPost]
[ValidateAntiForgeryToken]
[OutputCache(持续时间=120,位置=OutputCacheLocation.Server)]
公共行动结果索引(DevicesAjaxViewModel viewModel)
{
尝试
{
//SetExpires(DateTime.Now.AddSeconds(30));
//Response.Cache.SetCacheability(HttpCacheability.Server);
Response.Cache.AddValidationCallback(IsCacheValid,Request.UserAgent);
#如果调试
睡眠(5000);
#恩迪夫
如果(!ModelState.IsValid)返回Json(newmodelError(“模型中的错误”);
var allObjects=_objectService.GetAllObjects();
字符串objectName=allObjects.First(q=>q.Id==viewModel.ObjectId).Name;
KeyValuePair KeyValuePair=ApplyFiltering(objectName,viewModel.PageNumber,false,viewModel.Filtering);
FilteringDevicesResultModel FilteringDevicesResultModel=新的FilteringDevicesResultModel
{
设备=keyValuePair.Value,
FoundDeviceCount=keyValuePair.Key.ToMoneyFormat(),
RequestId=viewModel.RequestId
};
返回PartialView(“~/Views/Partials/DevicesPagePartial.cshtml”,filteringDevicesResultModel);
}
捕获(例外情况除外)
{
返回Json(newmodelError(ex.Message));
}
}
void IsCacheValid(HttpContext HttpContext,对象数据,参考HttpValidationStatus状态)
{
如果(真)
状态=HttpValidationStatus.Valid;
其他的
状态=HttpValidationStatus。无效;
}
我应该如何实现它?VaryByParam的输出缓存
默认值是“*”
,因此这将根据查询字符串中的所有参数或post中的参数改变缓存
您的表单上有一个防伪令牌(@Html.AntiForgeryToken()
),每当呈现页面时,该令牌都会获得一个新值,导致输出缓存认为这是一个变体
要么将VaryByParam设置为“无”,包括一个您想要更改的道具列表,要么使用VaryByCustom
[OutputCache(Duration = 120, Location = OutputCacheLocation.Server, VaryByParam="none")]