Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MVC5,C#中的PartialView控制器中使用OutputCache?_C#_Asp.net Mvc_Outputcache - Fatal编程技术网

如何在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")]