1

当我重定向到另一个控制器的操作时,我的会话变为空,我该怎么办?

4

4 回答 4

1

我意识到在像这样在登录时设置新会话之前我正在清除和销毁所有会话

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Session.Abandon();
Session.Clear();

当我删除这些行时,一切都开始像@Clayton 所说的那样工作,所以我删除了这些行并将其替换为Session.Remove('sessionvariablename'),我仍然不确定上述行导致了什么问题,但我的代码开始工作。

于 2012-08-13T06:30:05.663 回答
1

您必须创建一个具有会话属性的唯一基本控制器,然后项目中的所有控制器都将从该 BaseController 继承:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MonitoringCSP.Controllers
{
//[AllowAnonymous]
//[Authorize(Roles = "admin")]
public class BaseController : Controller
{
    private HttpSessionStateBase _session;
    protected HttpSessionStateBase CrossControllerSession
    {
        get
        {
            if (_session == null) _session = Session;
            return _session;
        }
        set {
                _session = Session;
            }
        }
    }
}

使用示例

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    using System.Web.Security;
    using MonitoringCSP.Models;

    namespace MonitoringCSP.Controllers
    {
[AllowAnonymous]
public class AccountController : BaseController
{
    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
                /*session*/
                CrossControllerSession["UserName"] = User.Identity.Name;
                /*end session*/
        return RedirectToAction("someAction");
        }
   }
}
于 2013-11-12T19:53:06.780 回答
1

关于您发布给我的评论,这就是我的想法。在需要会话的控制器中,使用类似于以下内容的内容:

//Controller A
public class TheController : Controller
{
   public ActionResult Index(){
     Session["yourSession"] = "Hello World";
     return View();
   }
}


//Controller B
public class MyController : Controller
{
    string textString;

    protected override void OnActionExecuting(ActionExecutingContext ctx)
    {
        base.OnActionExecuting(ctx);
        textString = ctx.HttpContext.Session["yourSession"].ToString();
    }

    public ActionResult Index(){
       string currentText = textString;
       return View();
    }
}

我测试了来自(http://stackoverflow.com/questions/889516/session-null-in-asp-net-mvc-controller-constructors)的建议,并且会话的内容是可用的。

于 2012-08-07T11:58:13.617 回答
1

确保您的控制器上没有设置此属性:

[SessionState(SessionStateBehavior.Disabled)]
于 2021-11-19T16:59:29.037 回答