使用旧参数调用的控制器操作

时间:2013-03-20 11:59:34

标签: asp.net-mvc asp.net-mvc-4

在我的公司,我们无法为每个新请求实例化一个控制器。我们必须将它存储在会话中并且每次都重新使用它,我知道这是错误的,但我们必须在请求之间保持控制器的状态。所以这就是我们所做的:

我们创建了这个控制器工厂:

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'参数将具有第一次调用该操作的值。我找不到任何可以解释这一点的东西。请求参数字典具有正确的值,但操作仍然获得旧值。

1 个答案:

答案 0 :(得分: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();
        }
    }
}

希望这会有所帮助,