【问题标题】:Session null issue in mvc when i call a action method from Different Controller当我从不同的控制器调用操作方法时,mvc 中的会话空问题
【发布时间】:2014-09-30 21:22:14
【问题描述】:

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

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

【问题讨论】:

  • 会话中可能没有任何内容。试试Session["WorkingImageExtension"]= "some default value"。然后检查您是否可以在另一个控件中访问它。是的,您可以跨控制器访问会话。只有当你关闭浏览器时它才会被销毁
  • 但在我的情况下,当我将光标悬停在会话而不是 Session["WorkingImageExtension"] 整体上时,它给了我 null 并给我一个错误,即对象引用未设置为对象的实例。
  • 你确定是空的会话对象而不是uploadedFileMeta吗?为什么不试试dotnetdreamer给出的建议,给Session["WorkingImageExtension"]赋值一个字符串,然后单步执行。
  • 你也可以试试If条件。即if(Session["WorkingImageExtension"] !=null) { // session isn't null } else { //session is null }
  • 并确保调试代码

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


【解决方案1】:

真的很简单。

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

结果是您的MediaController 上的Sessionnull

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

【讨论】:

  • 所以解决方案是将我的媒体控制器代码移动到家庭控制器?
  • 可能。将您的控制器分开
【解决方案2】:

这是我解决类似问题的方法

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多