【问题标题】:Access parameter of action method into controller's constructor将action方法的参数访问到控制器的构造函数中
【发布时间】:2015-10-15 14:21:19
【问题描述】:

我有一个名为BaseController 的控制器,它被所有其他控制器继承。我有一个BaseController 的构造函数,我在其中根据它从会话中选择的变量 patId 进行一些计算,并在此计算的基础上允许用户执行一些操作。

但是有一个控制器MyController,它的动作第一次从另一个应用程序模块将这个变量接收到这个模块中,所以在此之前它不会被设置到会话中。

public ActionResult MyAction(string patId)
{
  // First time patId is been set into session 

}

所以我的BaseController 计算在此操作中出错了。有没有办法可以将此变量值放入BaseController 的构造函数中。这样我就可以检查会话值是否为空,然后检查此参数并设置会话。

请建议我是否可以这样做,或者我可以通过任何其他方式解决我的问题。

【问题讨论】:

  • 仅使用控制器构造函数是不可能的。您不能只检查该值是否在会话中可用,并且是否不停止计算?另一种选择是在到达控制器之前拦截所有传入的请求并从中获取值(如果需要),请参阅this thread 了解想法
  • 谢谢@Andrei .. 看来它会有所帮助。我会尝试选择第二个选项,如果这对我有帮助,我会试一试
  • @Andrei ,如果我使用 ActionFilter 来拦截请求,但是控制器的构造函数会比 FilterAttribute 更先被调用。
  • 嗯,我并不是说从那个线程开始的动作过滤器方法,我认为这很明显。别人讲http模块和Application_BeginRequest,应该对你比较有用

标签: c# asp.net-mvc session


【解决方案1】:

Andrei 的评论帮助了我,我使用了thread mentioned by Andrei。讨论过拦截传入的请求。有两种方法可以帮助我:HttpModuleApplication_BeginRequest,我后来选择了。

但我在控制器本身的构造函数中通过使用 HttpContext 拦截 http 请求来做到这一点,这在控制器的构造函数中也可用。

public BaseController()
{
   // Check if variable exist in session
   // else check if patId is sent through request
   // then save it in session

   System.Web.HttpContext.Current.Session["PatId"] = System.Web.HttpContext.Request.Form["patId"];

   // perform remaining calculation
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2017-02-13
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多