【问题标题】:Controller action called with old parameter使用旧参数调用的控制器操作
【发布时间】:2013-03-20 11:59:33
【问题描述】:

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

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

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

【问题讨论】:

  • 这就像糟糕的,非常糟糕的模式......你为什么不提取你需要在一些静态类中坚持的东西?静态类在不同的 HttpContext 实例之间共享。
  • 我知道这很糟糕,但我们的情况更糟。我的老板不太喜欢改变我们的工作方式,所以我正在尝试非常缓慢地改变事情。而且我认为您的方法可能会使事情变得更加混乱(我有很多数据需要保留)

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


【解决方案1】:

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

希望这会有所帮助,

【讨论】:

  • 是的,这行得通,谢谢。 (但是controller.TempDataDictionary不存在,这里只有TempData)
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多