这就是我所拥有的:

[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一起使用?

最佳答案

MSDN中的VaryByParam值:用分号分隔的字符串列表,与GET方法的查询字符串值或POST方法的参数值相对应。

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

另一种方法是使OutputCacheAttribute和用户反射成为子类,以创建VaryByParam String。像这样的东西:

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

并在 Controller 中:
[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

关于c# - ASP NET MVC OutputCache VaryByParam复杂对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30395376/

10-09 06:09