使用outputcache属性修饰控制器时使用Html.Action的异常

时间:2013-09-12 09:39:35

标签: c# asp.net-mvc-4 redirect razor outputcache

当控制器使用Html.Action属性修饰时,从视图中调用OutputCache时会抛出异常。但是当我从控制器中删除属性时,一切都按预期工作。

我不想删除OutputCache属性,我不明白该属性如何负责抛出异常。我该如何解决这个问题?

控制器:

[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class TestController : Controller
{
    public PartialViewResult Test()
    {
        Debug.WriteLine("test");
        return PartialView();
    }
}

查看:

<div>
    <!-- Tab 1 -->
    @Html.Action("Test")
</div>

例外:

{"Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'."}

的InnerException

{"Child actions are not allowed to perform redirect actions."}

更新 我尝试禁用outputcache时只得到异常。通过添加上述属性或将持续时间设置为0。

2 个答案:

答案 0 :(得分:1)

还有其他方法可以禁用缓存,转到 Global.asax.cs文件,并添加以下代码,

protected void Application_BeginRequest()
        {
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
            Response.Cache.SetNoStore();
        }

现在您不需要添加[OutputCache]属性。让我知道它是否有效!干杯

答案 1 :(得分:0)

outputcache属性生成了一个隐藏的异常,因为未指定Duration属性。但是持续时间不能为0,因此使OutputCache属性对我来说不是很有用。我决定创建自己的NoCache属性来处理工作。 (见下面的代码)

使用此属性而不是OutputCacheAttribute解决了我的问题。

using System;
using System.Web;
using System.Web.Mvc;

namespace Cormel.QIC.WebClient.Infrastructure
{
    public class NoCacheAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
            filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
            filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
            filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            filterContext.HttpContext.Response.Cache.SetNoStore();

            base.OnResultExecuting(filterContext);
        }
    }
}