1

mvc ビュー内で遅延データをフェッチしたい。
だから私はActionFilterAttributeあなたが怒鳴るのを見ることができるように作成しました。
しかし、何らかの理由で、セッションは の前に終了しOnActionExecutedます。
理由はありますか?
送信

public class DatabaseTransactionAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            DatabaseConnector.GetTransaction();
        }



        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if(DatabaseConnector.GetCurrentSession().IsActive())
            {
                if(filterContext.Exception == null)
                {
                    DatabaseConnector.GetCurrentSession().Commit();
                }
                else
                {
                    DatabaseConnector.GetCurrentSession().MarkForRollBack();
                }
            }
        }
}
4

1 に答える 1

1

ここでの問題は、View がOnActionExecuted メソッドの後に評価されることです。

ビュー内でデータを遅延ロードしたい場合(最大で N+1 エラーが発生するため、お勧めしません)、代わりに OnResultExecuted メソッドでトランザクションをコミットする必要があります。

これを行う前に慎重に検討してください - 元のコードが優先されます。

例えば

public class DatabaseTransactionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        DatabaseConnector.GetTransaction();
    }

    public override void OnResultExecuted(ActionExecutedContext filterContext)
    {
        if(DatabaseConnector.GetCurrentSession().IsActive())
        {
            if(filterContext.Exception == null)
            {
                DatabaseConnector.GetCurrentSession().Commit();
            }
            else
            {
                DatabaseConnector.GetCurrentSession().MarkForRollBack();
            }
        }
    }
}
于 2012-10-20T12:25:31.593 に答える