2013-04-30 59 views
1

enter image description here我有兩個控制器HomeControllerMediaController。 當我提交表單時,從HomeController調用動作名稱EmployeeDetails當我從不同的控制器調用動作方法時,mvc中的會話null問題

[Authorize] 
    [HttpPost] 
    public ActionResult EmployeeDetails(Employee Employee, string Command) 
    { 
      MediaController MediaController = new Controllers.MediaController(); 
      Employee.EmployeeModel.newImageId=MediaController.ProcessUploadedImage(FileUpload);  

    } 

從這個方法我稱之爲ProcessUploadedImage方法,該方法是在MediaContoller

public Guid ProcessUploadedImage(FileUpload uploadedFileMeta) 
    { 
     Session["WorkingImageExtension"]=uploadedFileMeta.Filename.Substring(uploadedFileMeta.Filename.LastIndexOf('.')).ToLower(); 

    } 

這裏的問題是,在ProcessUploadedImage方法,我得到會話空值,這意味着當我檢查會話中的價值快速查看它顯示null.when我將鼠標懸停在會議上它在調試模式下顯示空。 所以我的問題是,我可以在交叉控制器方法訪問期間訪問會話嗎?

+0

會話內可能沒有任何內容。嘗試'會議[「WorkingImageExtension」] =「一些默認值」'。然後檢查是否可以在另一個控制中訪問它。是的,您可以跨控制器訪問會話。它僅在關閉瀏覽器 – 2013-04-30 05:52:07

+0

時被破壞,但在我的情況下,當我將鼠標懸停在會話而不是Session [「WorkingImageExtension」]上時,它會給我null,並給我一個錯誤,指出對象引用未設置爲對象的實例。 – 2013-04-30 05:55:34

+0

你確定它的會話對象是null而不是'uploadedFileMeta'嗎?爲什麼不嘗試dotnetdreamer給出的建議,併爲'Session [「WorkingImageExtension」]'指定一個字符串,然後逐步完成。 – 2013-04-30 06:04:26

回答

2

真的很簡單。

控制器並不意味着在您的代碼中手動實例化。 ControllerBase中有很多基礎結構代碼,它們是由MVC基礎結構設置的。

結果就是您的MediaController上的Sessionnull

解決方案是以一種不會像現有代碼那樣在兩個控制器之間引入耦合的方式重構代碼。

+0

所以解決方案是將我的媒體控制器代碼移到主控制器? – 2013-04-30 06:29:52

+0

可能。保持你的控制器分離 – 2013-04-30 10:43:50

0

這是我如何解決了類似的問題

我知道這是不是做的最好的方式,但它幫助我:

首先,我創建了一個基本的控制器如下

public class BaseController : Controller 
{ 
    private static HttpSessionStateBase _mysession; 
    internal protected static HttpSessionStateBase MySession { 
     get { return _mysession; } 
     set { _mysession = value; } 
    } 
} 

然後我改變了其他所有控制器的代碼,讓它們從基本控制器類繼承。

然後我推翻了「OnActionExecuting」的方法如下:的

public class xUserController : BaseController 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     BaseController.MySession = Session; 
     base.OnActionExecuting(filterContext); 
    } 
    [HttpPost] 
    public ActionResult LogIn(FormCollection form) 
    { 
     //---KillFormerSession(); 
     var response = new NzilameetingResponse(); 
     Session["UserId"] = /*entity.Id_User*/_model.Id_User; 
     return Json(response, "text/json", JsonRequestBehavior.AllowGet); 
    } 
} 

Finally, I've changed the way I call session variables. 

string SessionUserId = ((BaseController.MySession != null) &&  (BaseController.MySession["UserId"] != null)) ?  BaseController.MySession["UserId"].ToString() : ""; 

代替

string SessionUserId = ((Session != null) && (Session["UserId"] != null)) ? Session["UserId"].ToString() : ""; 

現在的作品和我的會話增值經銷商可以在所有控制器行走。

Source

相關問題