我有一个输出相当静态的操作,直到另一个操作用于更新第一个操作的数据源.我使用HttpResponse.RemoveOutputCacheItem删除该操作的缓存输出,以便下次用户加载时刷新它.
基本上我有这样的动作:
[OutputCache(Duration=86400,Location=OutputCacheLocation.Server)] public ActionResult Index() { return ... }
在我的HomeController上,另一个控制器上的另一个动作更新了前者使用的信息:
public ActionResult SaveMenu(int id,Menu menu) { ... HttpResponse.RemoveOutputCacheItem(Url.Action("Index","Home")); ... }
疯狂的是,只要您要么加载URL http:// site /或http:// site / Home / Index,这就行了.当您使用URL http:// site时,它永远不会刷新.
这是为什么?
解决方法
public override void OnResultExecuting(ResultExecutingContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } if (!filterContext.IsChildAction) { new OutputCachedPage(this._cacheSettings).ProcessRequest(HttpContext.Current); } }
ResultExecutingContext filterContext派生自ControllerContext.这是ControllerContext.IsChildAction的源代码:
public virtual bool IsChildAction { get { RouteData routeData = this.RouteData; if (routeData == null) { return false; } return routeData.DataTokens.ContainsKey("ParentActionViewContext"); } }
那么,为什么这与您的问题相关?
因为当你省略“/”时,你的路线与任何东西都不匹配.默认路由为“/”.这篇文章更深入地解释了这一点:http://www.58bits.com/blog/2008/09/29/ASPNet-MVC-And-Routing-Defaultaspx.aspx.编写它是为了解释为什么在ASP.NET MVC 1项目中必须使用Default.aspx文件,但原因是根植于同一个地方.
因此,基本上,RouteData为null,因此OutputCacheAttribute无法工作.您可以通过执行Michael Jasper建议并利用URL重写来解决您的问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。