Asp.net mvc 使用旧参数调用控制器操作

Asp.net mvc 使用旧参数调用控制器操作,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,在我的公司,我们不能为每个新请求实例化一个控制器。我们必须将其存储在会话中,每次都重新使用它,我知道这是错误的,但我们必须在请求之间保持控制器的状态。下面是我们所做的: 我们创建了这个控制器工厂: public class SGVControllerFactory : IControllerFactory { public IController CreateController(RequestContext requestContext, string control

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

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

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 });
}
publicjsonresult Foo(字符串栏){
返回Json(新列表{Bar,Bar});
}

“Bar”参数将始终具有对操作的第一次调用的值。我找不到任何解释。请求参数字典具有正确的值,但操作仍会获取旧值。

您可以尝试通过重写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();
        }
    }
}

希望这会有所帮助,

这是一种非常糟糕的模式。。。为什么不提取在某个静态类中持久化所需的内容?静态类在不同的HttpContext实例之间共享。我知道这很糟糕,但我们所拥有的更糟糕。我的老板不太喜欢改变我们的工作方式,所以我试着慢慢改变。我想你的建议会让事情变得更混乱(我有很多数据需要坚持)是的,这很有效,谢谢你。(但是controller.TempDataDictionary不存在,这里只有TempData)