Asp.net mvc 5 如果参数是列表,则VaryByParam将失败

Asp.net mvc 5 如果参数是列表,则VaryByParam将失败,asp.net-mvc-5,outputcache,varybyparam,Asp.net Mvc 5,Outputcache,Varybyparam,我在MVC中有这个动作 [OutputCache(Duration = 1200, VaryByParam = "*")] public ActionResult FilterArea( string listType, List<int> designersID, int currPage = 1 ) { // Code removed } [OutputCache(持续时间=1200,VaryByParam=“*”)] public ActionResult Filter

我在MVC中有这个动作

[OutputCache(Duration = 1200, VaryByParam = "*")]
public ActionResult FilterArea( string listType, List<int> designersID, int currPage = 1 )
{
   // Code removed
}
[OutputCache(持续时间=1200,VaryByParam=“*”)]
public ActionResult FilterArea(字符串listType,列表设计器ID,int currPage=1)
{
//代码删除
}
无法使用url显示正确的HTML,如


这是.NET中OutputCache的已知错误吗?原因是无法识别带有列表参数的VaryByParam,还是我遗漏了什么?

我在MVC3中也遇到了同样的问题,我相信MVC5中的情况仍然是一样的

这是我的设置

要求 POST,内容类型:application/json,传入字符串数组作为参数

{“选项”:[“选项1”,“选项2”]}
控制器方法
[OutputCache(持续时间=3600,位置=OutputCacheLocation.Any,VaryByParam=“options”)]
公共操作结果GetOptionValues(列出选项)
我用OutputCache尝试了所有可能的选项,但它对我来说就是无法缓存。对于实际的方法来说,绑定工作得很好。我最大的怀疑是OutputCache没有创建唯一的缓存键,所以我甚至从
System.Web.MVC.OutputCache
中取出了它的代码来验证。我已经验证了,即使传入了
列表
,它也能正确地构建唯一键。还有一些东西是有问题的,但不值得花更多的精力

OutputCacheAttribute.GetUniquedFromActionParameters(filterContext,
OutputCacheAttribute.SplitVaryByParam(this.VaryByParam);
变通办法 在另一篇SO帖子之后,我创建了自己的OutputCache属性。使用起来容易多了,我可以享受剩下的一天

控制器方法
[MyOutputCache(持续时间=3600)]
公共操作结果GetOptionValues(选项)
自定义请求类 我继承了
列表
,因此我可以在MyOutputcache类中调用重写的
.ToString()
方法,为我提供唯一的缓存键字符串。仅此方法就解决了其他人的类似问题,但我却没有

[DataContract(Name=“Options”,Namespace=”“)]
公共类选项:列表
{
公共重写字符串ToString()
{
var optionString=新的StringBuilder();
foreach(本文件中的var选项)
{
optionString.Append(选项);
}
返回选项String.ToString();
}
}
自定义OutputCache类
公共类MyOutputCache:ActionFilterAttribute
{
私有字符串_cachedKey;
公共整数持续时间{get;set;}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
if(filterContext.HttpContext.Request.Url!=null)
{
var path=filterContext.HttpContext.Request.Url.PathAndQuery;
var AttributeName=filterContext.ActionParameters[“选项”]作为AttributeName;
如果(attributeNames!=null)_cachedKey=“MYOUTPUTCACHE:”+path+attributeNames;
}
if(filterContext.HttpContext.Cache[\u cachedKey]!=null)
{
filterContext.Result=(ActionResult)filterContext.HttpContext.Cache[_cachedKey];
}
其他的
{
base.OnActionExecuting(filterContext);
}
}
公共覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文)
{
filterContext.HttpContext.Cache.Add(_cachedKey,filterContext.Result,null,
DateTime.Now.AddSeconds(持续时间),System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,空);
base.OnActionExecuted(filterContext);
}
}

问题到底是什么?问题是,如果您尝试使用2个不同的视图获取2个不同的视图,系统将失败,并获取您请求的第一个视图,因为如果参数是字符串、int或其他任何内容的列表,则他不会变位参数。:(这可能是一个解决方案,但MVC代码中仍然存在错误。