2015-10-14 27 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 
} 
相關問題