我们使用ActionFilterAttribute将一些参数注入到操作中,而且效果很好。
但是,当我们添加OutputCache时,它只在"MyID“上变化,当使用Html.RenderAction()时,而不是在直接浏览动作时。
有什么办法让OutputCache永远识别"MyID“吗?
控制器
[SiteIDs, OutputCache]
public ActionResult SiteContent(string myID)
{
return Content(myID);
}ActionFilter
public class SiteIDs : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionParameters.ContainsKey("MyID"))
{
filterContext.ActionParameters["MyID"] = GetMyIDByHostname();
}
base.OnActionExecuting(filterContext);
}
}发布于 2015-09-14 09:36:45
使用OutputCacheAttribute,当从缓存中检索页面时,操作筛选器将不会执行。您可能应该使用mvcdonutcaching,以便在从缓存检索时执行操作筛选器。我建议你读这。
发布于 2015-09-14 11:56:48
备选案文1
根据这个答案,您只需要使用VaryByParam = "*",它将根据传递操作方法的参数自动变化。
[SiteIDs, OutputCache(VaryByParam = "*")]
public ActionResult SiteContent(string myID)
{
return Content(myID);
}但是,通过使用IActionFilter (还没有尝试过),这可能不起作用。您可以尝试使用IValueProvider (无论如何,这是使用动作过滤器进行操作的一种更干净的方法)。
选项2
您可以使用VaryByCustom和GetVaryByCustomString根据主机名更改缓存。
[SiteIDs, OutputCache(VaryByParam = "none", VaryByCustom = "hostname")]
public ActionResult SiteContent(string myID)
{
return Content(myID);
}在您的Global.asax文件中:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "hostname")
{
return "HostName=" + context.Request.Url.Host;
}
return base.GetVaryByCustomString(context, custom);
}
}请记住,只有在未设置OutputCache的情况下,操作筛选器才会被击中。因此,您需要更改与您的ID不同的值(或值)上的缓存。最简单的解决方案是使用HttpContext中已经存在的内容,例如主机名。
https://stackoverflow.com/questions/32520185
复制相似问题