0

当我用属性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'."}

内部异常

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

更新 当我尝试禁用输出缓存时,我只会得到异常。通过添加上述属性或将持续时间设置为 0。

4

2 回答 2

1

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

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

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

于 2013-09-12T09:59:06.013 回答
0

由于未指定 Duration 属性,因此 outputcache 属性生成了隐藏异常。但是,持续时间不能为 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);
        }
    }
}
于 2013-09-12T10:21:22.667 回答