1

在此处输入图像描述我有两个控制器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。所以我的问题是,我可以在跨控制器方法访问期间访问会话吗?

4

2 回答 2

2

真的很简单。

控制器并不意味着在您的代码中手动实例化。有很多基础设施代码ControllerBase是由 MVC 基础设施设置的。

其结果是Session您的MediaControllernull

解决方案是重构代码,不会像当前代码那样在两个控制器之间引入耦合。

于 2013-04-30T06:21:43.550 回答
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() : "";

现在它可以工作了,我的会话变量可以遍历所有控制器。

资源

于 2014-09-30T13:22:14.657 回答