我有一个问题,我的MVC项目! 我们的目标是建立一个会话变种,以便将它传递给所有控制器:我xUserController内,
Session["UserId"] = 52;
Session.Timeout = 30;
string SessionUserId = ((Session != null) && (Session["UserId"] != null)) ? Session["UserId"].ToString() : "";
// SessionUserId = “52”
但ChatMessageController内
[HttpPost]
public ActionResult AddMessageToConference(int? id,ChatMessageModels _model){
var response = new NzilameetingResponse();
string SessionUserId = ((Session != null) && (Session["UserId"] != null)) ? Session["UserId"].ToString() : "";
//...
}
return Json(response, "text/json", JsonRequestBehavior.AllowGet);
}
SessionUserId = “”
那么,为什么这样? 如何设置会话变量是我的所有控制器内的全球?
只能有两个这样的行为的原因:第一个是你的会话已经结束,第二个是你在应用程序的另一个地方,你重写会话变量。 Wthout任何额外的代码没有什么可多说。
这里是我是如何解决这个问题
我知道这是不是做的最好的方式,但它帮助我:
首先,我已经创建了一个基本控制器如下
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);
}
}
最后,我已经改变了我呼叫会话变量的方法。
string SessionUserId = ((BaseController.MySession != null) && (BaseController.MySession["UserId"] != null)) ? BaseController.MySession["UserId"].ToString() : "";
代替
string SessionUserId = ((Session != null) && (Session["UserId"] != null)) ? Session["UserId"].ToString() : "";
现在它的工作原理和我的会话增值经销商可以在所有控制器行走。