ASP NET MVC输出缓存VaryByParam复杂对象

5

这是我拥有的内容:

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

我希望它可以为每个不同的模型缓存一个新结果。目前, 它只缓存第一个结果,即使模型改变了,它也会返回相同的结果。 我甚至试图重写ReportFilterModel的ToString和GetHashCode方法。实际上,我有更多属性想用于生成唯一的HashCode或String。
public override string ToString() {
    return SiteId.ToString();
}

public override int GetHashCode() {
    return SiteId;
}

任何建议,如何让复杂对象与OutputCache配合使用?
1个回答

12
从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))]

获取更多信息,请查看:如何在多个参数中使用VaryByParam?

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


这并没有帮助我,我如何在那里使用复杂对象? - Jaanus
你不能使用复杂对象,但是可以设置VaryByParam = "propname1;propname2;propname3",假设它被发布或在查询字符串中。 - Daniel Stackenland
我更新了我的答案,这更符合你的要求吗? - Daniel Stackenland
你是在说如果我像这样定义缓存属性VaryByParam =“siteId”,那么它会使用我的复杂对象modelsiteId属性吗? - Jaanus
不,我的意思是浏览器根据HTTP方法(POST或GET)将siteId作为查询字符串值或表单字段发送。ASP模型绑定使用这些值来创建您的模型,您还可以使用相同的值来控制输出缓存。 - Daniel Stackenland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接