3

ここ私の会社では、新しいリクエストごとにコントローラーをインスタンス化することはできません。セッションに保存して毎回再利用する必要があります。これが間違っていることはわかっていますが、リクエスト間でコントローラーの状態を維持する必要があります。そこで、次のことを行いました。

このコントローラ ファクトリを作成しました。

public class SGVControllerFactory : IControllerFactory
    {

        public IController CreateController(RequestContext requestContext, string controllerName)
        {
            string _SessionId = controllerName + "Controller";
            foreach (var _Object in HttpContext.Current.Session)
            {
                if (_Object.ToString() == _SessionId)
                {
                    IController _Controller = (IController)HttpContext.Current.Session[_Object.ToString()];



                    return _Controller;
                }
            }
            return null;
        }


        public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
        {
            return SessionStateBehavior.Default;
        }


        public void ReleaseController(IController controller)
        {
            //We never release our controllers!!!
        }
    }

そして、このベースコントローラーがあります:

public class SGVController : Controller
    {
        protected override void Execute(RequestContext requestContext)
        {
            if (requestContext == null)
            {
                throw new ArgumentNullException("requestContext");
            }
            if (requestContext.HttpContext == null)
            {
                throw new ArgumentException("Http context is null", "requestContext");
            }

            Initialize(requestContext);

            using (ScopeStorage.CreateTransientScope())
            {                
                ExecuteCore();
                Dispose();
            }
        }

    }

このコントローラー クラスがデフォルトの MVC コントローラーと異なる唯一の点は、一度だけ呼び出されるように制限されていないことです。

さて、私の問題は..このアクションがある場合:

public JsonResult Foo(string Bar) {
 return Json(new List<string> { Bar, Bar });
}

「Bar」パラメーターには、アクションへの最初の呼び出しの値が含まれます。それを説明するものは何も見つかりません。リクエスト パラメータ ディクショナリには正しい値がありますが、アクションはまだ古い値を取得します。

4

1 に答える 1

2

Initializeメソッドをオーバーライドして新しい値を処理することにより、ValueProviderとTempDataを再初期化することができます。

public class SGVController : Controller
{

  protected override void Initialize(RequestContext requestContext)
   {
    this.TempData = null;
    this.ValueProvider = null;

    base.Initialize(requestContext);
   }        

    protected override void Execute(RequestContext requestContext)
    {
        if (requestContext == null)
        {
            throw new ArgumentNullException("requestContext");
        }
        if (requestContext.HttpContext == null)
        {
            throw new ArgumentException("Http context is null", "requestContext");
        }

        Initialize(requestContext);

        using (ScopeStorage.CreateTransientScope())
        {                
            ExecuteCore();
            Dispose();
        }
    }
}

これがお役に立てば幸いです、

于 2013-03-20T14:01:06.170 に答える