我正在考虑实施类似静态 SessionHelper 类的内容,我希望在会话中保留一些数据。
但似乎不可能在 Controller 类中使用 Session 对象。正确?
或者可能是我错了... I.e.此链接是解决方案ASP.NET MVC - How to access Session data in places other than Controller and Views
请告诉我!
无论如何,我现在无法引用位于模型文件夹中的该类中的会话对象。
public static class SessionHelper
{
public static bool ShowSuccessPopup
{
get
{
if (Session["ShowSuccessPopup"] == null)
{
Session["ShowSuccessPopup"] = false;
return false;
}
else
{
var result = (bool)Session["ShowSuccessPopup"].ToString();
return result;
}
}
set {Session["ShowSuccessPopup"] = value; }
}
}
答案 0 :(得分:3)
Session
对象仅在请求周期中设置,因此请求周期之外的任何内容都无法访问它(即控制器和视图很好,但模型没有)。如果需要在请求周期之外的某些事务中使用会话,则必须将Session对象作为依赖项注入。但是,您无法使用静态类完成此操作。所以你可能会尝试类似的东西:
public class SessionHelper
{
private HttpSessionState session;
public SessionHelper (HttpSessionState session)
{
this.session = session;
}
public bool ShowSuccessPopup { ... }
}
或者,您可以单独将会话注入实际方法,但是您将无法继续使用属性:
public static bool ShowSuccessPopup (HttpSessionState session)
{
// do something with session
}
答案 1 :(得分:1)
感谢 Chris Pratt !
就像另一种选择,我会分享我的方法。
public partial class BaseController : Controller
{
public SessionBox SessionBox;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
SessionBox = new SessionBox(filterContext.HttpContext);
base.OnActionExecuting(filterContext);
}
}
public class SessionBox
{
private HttpContextBase context { get; set; }
public SessionBox(HttpContextBase context)
{
this.context = context;
}
public bool ShowSuccessPopup
{
get
{
if (context.Session["ShowSuccessPopup"] == null)
{
context.Session["ShowSuccessPopup"] = false;
return false;
}
else
{
var result = Convert.ToBoolean(context.Session["ShowSuccessPopup"].ToString());
return result;
}
}
set { context.Session["ShowSuccessPopup"] = value; }
}
}
请注意,您应该在Controller
类上继承BaseController
类
然后在Controller
课程中你可以做
if (SessionBox.ShowSuccessPopup)
{
SessionBox.ShowSuccessPopup = false;
以下是显示
之间差异的额外链接http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.aspx
和
http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx