【问题标题】:ASP NET MVC OutputCache VaryByParam complex objectsASP NET MVC OutputCache VaryByParam 复杂对象
【发布时间】:2015-05-22 11:20:27
【问题描述】:

这就是我所拥有的:

[OutputCache(Duration = 3600, VaryByParam = "model")]
public object Hrs(ReportFilterModel model) {
    var result = GetFromDatabase(model);
    return result;
}

我希望它为每个不同的模型缓存一个新结果。目前它正在缓存第一个结果,即使模型发生变化,它也会返回相同的结果。

我什至尝试覆盖 ReportFilterModel 的 ToStringGetHashCode 方法。实际上我有更多的属性可以用来生成独特的HashCodeString

public override string ToString() {
    return SiteId.ToString();
}

public override int GetHashCode() {
    return SiteId;
}

任何建议,我怎样才能让复杂的对象使用OutputCache

【问题讨论】:

    标签: c# asp.net-mvc caching outputcache


    【解决方案1】:

    来自 MSDN 的 VaryByParam 值:以分号分隔的字符串列表,对应于 GET 方法的查询字符串值或 POST 方法的参数值。

    如果您想通过所有参数值改变输出缓存,请将属性设置为星号 (*)。

    另一种方法是创建 OutputCacheAttribute 的子类和用户反射来创建 VaryByParam 字符串。像这样的:

     public class OutputCacheComplex : OutputCacheAttribute
        {
            public OutputCacheComplex(Type type)
            {
                PropertyInfo[] properties = type.GetProperties();
                VaryByParam = string.Join(";", properties.Select(p => p.Name).ToList());
                Duration = 3600;
            }
        }
    

    在控制器中:

    [OutputCacheComplex(typeof (ReportFilterModel))]
    

    更多信息: How do I use VaryByParam with multiple parameters?

    https://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute.varybyparam(v=vs.118).aspx

    【讨论】:

    • 这对我没有帮助,我如何在那里使用复杂的对象?
    • 您不能使用您的复杂对象,但是,您可以设置 VaryByParam = "propname1;propname2;propname3" 假设它已发布或在查询字符串中
    • 对我的回答进行了更新,这更像您要找的吗?
    • 你是说如果我定义像VaryByParam = "siteId"这样的缓存属性,那么它将使用我的复杂对象model属性siteId
    • 不,我说浏览器将 siteId 作为查询字符串值或作为表单字段发送,具体取决于 http 方法(发布或获取)。 ASP Modelbinding 使用这些值来创建模型,您也可以使用相同的值来控制输出缓存
    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多