2015-10-14 58 views
1

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

但是有一个控制器MyController其操作首次将此变量从另一个应用程序模块接收到此模块中,所以直到此时它才被设置到会话中。

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

} 

因此,我的BaseController计算出现此错误。有没有一种方法可以将这个变量值写入BaseController的构造函数中。这样我可以检查会话值是否为空,然后检查此参数并设置会话。

请提出建议,如果我可以做到这一点,或者我可以从任何其他方式解决我的问题。

+1

只用控制器构造函数是不可能的。难道你不能只检查会话中的值是否可用,如果它不停止计算?另一种选择是拦截所有传入的请求,并在需要时从它们中获取值,然后将其发送到控制器,请参阅[本主题](http://stackoverflow.com/q/11726848/728795)以获取想法 – Andrei

+0

谢谢@Andrei看起来这会有所帮助。我会尝试选择第二个选项,并会尝试一下,如果这将有助于我 – prashant

+0

@Andrei,如果我使用ActionFilter拦截请求,但控制器的构造函数将首先被调用,而不是FilterAttribute。 – prashant

回答

1

安德烈评论帮助我,我用thread mentioned by Andrei。有人讨论了拦截传入的请求。有两种方法可以帮助我,分别是HttpModuleApplication_BeginRequest,我稍后选择了。

但我在控制器本身的构造函数中通过拦截http请求使用HttpContext,它也可以在控制器的构造函数中使用。

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 
} 
相关问题