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 に答える