首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutputCache与注入ActionParameters

OutputCache与注入ActionParameters
EN

Stack Overflow用户
提问于 2015-09-11 09:31:39
回答 2查看 230关注 0票数 0

我们使用ActionFilterAttribute将一些参数注入到操作中,而且效果很好。

但是,当我们添加OutputCache时,它只在"MyID“上变化,当使用Html.RenderAction()时,而不是在直接浏览动作时。

有什么办法让OutputCache永远识别"MyID“吗?

控制器

代码语言:javascript
复制
[SiteIDs, OutputCache]
public ActionResult SiteContent(string myID)
{
    return Content(myID);
}

ActionFilter

代码语言:javascript
复制
public class SiteIDs : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionParameters.ContainsKey("MyID"))
        {
            filterContext.ActionParameters["MyID"] = GetMyIDByHostname();
        }

        base.OnActionExecuting(filterContext);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-09-14 09:36:45

使用OutputCacheAttribute,当从缓存中检索页面时,操作筛选器将不会执行。您可能应该使用mvcdonutcaching,以便在从缓存检索时执行操作筛选器。我建议你读

票数 0
EN

Stack Overflow用户

发布于 2015-09-14 11:56:48

备选案文1

根据这个答案,您只需要使用VaryByParam = "*",它将根据传递操作方法的参数自动变化。

代码语言:javascript
复制
[SiteIDs, OutputCache(VaryByParam = "*")]
public ActionResult SiteContent(string myID)
{
    return Content(myID);
}

但是,通过使用IActionFilter (还没有尝试过),这可能不起作用。您可以尝试使用IValueProvider (无论如何,这是使用动作过滤器进行操作的一种更干净的方法)。

选项2

您可以使用VaryByCustomGetVaryByCustomString根据主机名更改缓存。

代码语言:javascript
复制
[SiteIDs, OutputCache(VaryByParam = "none", VaryByCustom = "hostname")]
public ActionResult SiteContent(string myID)
{
    return Content(myID);
}

在您的Global.asax文件中:

代码语言:javascript
复制
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中已经存在的内容,例如主机名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32520185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档