当我从不同的控制器调用一个动作方法时,mvc中的会话空问题

时间:2013-04-30 05:45:57

标签: asp.net-mvc asp.net-mvc-3 session

enter image description here我有两个控制器HomeControllerMediaController。 当我提交表单时,会从EmployeeDetails调用操作名称HomeController

    [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,这意味着当我在快速监视中检查Session的值时它显示为null。当我将光标悬停在Session上时,它在调试中显示为null模式。  所以我的问题是,我可以在跨控制器方法访问期间访问会话吗?

2 个答案:

答案 0 :(得分:2)

这很简单。

控制器并不意味着在代码中手动实例化。 ControllerBase中有很多基础设施代码,它们都是由MVC基础设施建立的。

结果是Session上的MediaControllernull

解决方法是以一种不会像当前代码那样引入两个控制器之间耦合的方式重构代码。

答案 1 :(得分:0)

以下是我解决类似问题的方法

我知道这不是最好的方法,但它帮助了我:

首先,我创建了一个基本控制器,如下所示

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

然后我在其他地方更改了所有控制器的代码,让它们从Base Controller类继承。

然后我覆盖了“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