ASP.Net MVC:如何从解决方案中的其他项目访问会话?

时间:2010-02-04 15:29:53

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

我的解决方案中有2个项目。

  1. MVC Web应用程序
  2. 类库

    • MVC Web应用程序引用类库。
    • 类库包含一个扩展默认ASP.Net控制器的类。
  3. 我在应用程序的Global.asax中将变量放入会话中。

    protected void Session_Start(object sender, EventArgs args)
    {
       HttpContext.Current.Session["DomainName"] = Request.Url.Host;
    }
    

    在类库中我试图从HttpContext.Session中获取值,但是HttpContext.Session一直保持为null。

    public class MyController : System.Web.Mvc.Controller
    {
        public MyController () : base()
        {
            //HttpContext.Session is always null at this point
            ViewData["DomainName"] = HttpContext.Session["DomainName"];
        } 
    }
    

    HttpContext。当前 .Session似乎不是控制器中的一个选项。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

两个问题 - Controller类中的HttpContext属性是当前会话。不幸的是,它在控制器的构造函数中不可用。显然因为它没有在构造函数中传递,所以必须先通过属性进行设置。您可以考虑添加一个属性来保存域名并从中引用会话 - 这样就可以在需要时使用它。

 protected string DomainName
 {
      get { return this.HttpContext.Session["DomainName"] as string; }
 }

在您的操作或OnActionExecuting / OnActionExecuted中设置ViewData。

 protected override void OnActionExecuted( ActionExecutedContext context )
 {
      ViewData["DomainName"] = this.HttpContext.Session["DomainName"];
      // or ViewData["DomainName"] = this.DomainName;  // if you used the property
 }

答案 1 :(得分:1)

如果您只是尝试从会话中添加ViewData,请尝试在OnActionExecuting方法中执行此操作。这是我通常为每个View添加我想要的ViewData。

答案 2 :(得分:0)

你只需使用Session(它是Controller的一个属性),但这只是映射到Controller.HttpContext.Session(换句话说,你已经使用的是),所以它不会解决你的问题,必须在其他地方。

我不确定你为什么把它放在会话中,因为你可以在行动中直接阅读Request.Url.Host

答案 3 :(得分:0)

当您创建cookie时,您必须编写

Response.AppendCookie("Your cookie name");

如果你想得到那么类似的东西

if (Request.Cookies["Your cookie name"] != null)
    {
        string value = Request.Cookies["Your cookie name"].Value;
    }

并且必须有不同的解决方案 那么

  

的machineKey

需要与

下相同
  

的System.Web

在web.config中

然后编写

<httpCookies domain=".yourdomainname.com" />