我有一个缓存的ActionResult。
[OutputCache(Duration = 3600, VaryByParam = "product_Id")]
public ActionResult ProductPreview(Guid product_Id)
{
// just for testing the cache
System.Threading.Thread.Sleep(4000);
return PartialView("ProductPreview", _repository.CreateProductModel(product_Id));
}
好消息是缓存正在运行。第一次加载后,结果显示没有任何4秒的延迟。
但是,当对该产品进行了一些更改时,我需要清除缓存。
我试图这样做清除缓存:
public ActionResult RemoveCache()
{
var url = Url.Action("ProductPreview", "Common");
// also tried with parameter
// var url = Url.Action("ProductPreview", "Common", new { @product_Id = "productId" });
HttpResponse.RemoveOutputCacheItem(url);
return RedirectToAction("Index");
}
我也尝试用ajax和整页刷新来调用RemoveCache方法,但是它们都不起作用。
我能做什么?问题出在哪里?
最佳答案
RemoveOutputCacheItem
仅适用于路由参数,不适用于查询字符串。因此,您可以修改您的路线定义:
routes.MapRoute(
"Default",
"{controller}/{action}/{product_Id}",
new { controller = "Home", action = "Index" }
);
现在,您可以使用RemoveOutputCacheItem方法:
public ActionResult RemoveCache(Guid product_Id)
{
var url = Url.Action("ProductPreview", "Common", new { product_Id = product_Id });
// the url must look like this: /Common/ProductPreview/eeb2fe32-db58-4fc3-87c8-b47480fbe094
// for the RemoveOutputCacheItem method to work
HttpResponse.RemoveOutputCacheItem(url);
return RedirectToAction("Index");
}
更新:
这是我的测试用例:
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[OutputCache(Duration = 3600, VaryByParam = "product_id")]
public ActionResult ProductPreview(Guid product_id)
{
var model = string.Format(
"{0} - {1}",
product_id,
DateTime.Now.ToLongTimeString()
)
return PartialView("_Foo", model);
}
public ActionResult RemoveCache(Guid product_id)
{
var url = Url.Action(
"ProductPreview",
"Home",
new { product_id = product_id }
);
HttpResponse.RemoveOutputCacheItem(url);
return RedirectToAction("Index");
}
}
查看(
~/Views/Home/Index.cshtml
):@{
var productId = Guid.NewGuid();
}
@Html.ActionLink("product 1", "ProductPreview", new { product_id = Guid.NewGuid() })
<br/>
@Html.ActionLink("product 2", "ProductPreview", new { product_id = productId })
<br/>
@Html.ActionLink("product 3", "ProductPreview", new { product_id = Guid.NewGuid() })
<br />
@Html.ActionLink(
"clear cache for the second product",
"RemoveCache",
new { product_id = productId }
)
局部视图(
~/Views/Home/_Foo.cshtml
):@model string
@Model
并在
global.asax
中:public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{product_id}",
new { controller = "Home", action = "Index", product_id = UrlParameter.Optional }
);
}
更新2:
现在,您已经显示了代码,似乎您正在使用
Html.RenderAction
帮助器,并且ProductPreview
是一个子操作。子操作与普通视图不在同一缓存中存储,并且HttpResponse.RemoveOutputCacheItem
帮助器对于已缓存的子操作根本不起作用。如果仔细查看前面的示例,您会发现我对ProductPreview
操作使用了标准链接。当前,您要实现的目标在ASP.NET MVC 3中是不可能的。如果要使用甜甜圈输出缓存,我建议您使用following article。希望可以在ASP.NET MVC 4中添加此功能。