Asp.net mvc 3 在MVC 3应用程序中,HttpContext.Current.Session为空

Asp.net mvc 3 在MVC 3应用程序中,HttpContext.Current.Session为空,asp.net-mvc-3,session-cookies,Asp.net Mvc 3,Session Cookies,我有一个双语MVC 3应用程序,我使用cookies和会话在session\u start方法中保存Global.aspx.cs文件中的“Culture”,但直接在它之后,会话为空 这是我的代码: protected void Session_Start(object sender, EventArgs e) { HttpCookie aCookie = Request.Cookies["MyData"]; if (aCookie == null

我有一个双语MVC 3应用程序,我使用cookies和会话在
session\u start
方法中保存
Global.aspx.cs
文件中的“Culture”,但直接在它之后,会话为空

这是我的代码:

    protected void Session_Start(object sender, EventArgs e)
    {
        HttpCookie aCookie = Request.Cookies["MyData"];

        if (aCookie == null)
        {
            Session["MyCulture"] = "de-DE";
            aCookie = new HttpCookie("MyData");
            //aCookie.Value = Convert.ToString(Session["MyCulture"]);
            aCookie["MyLang"] = "de-DE";
            aCookie.Expires = System.DateTime.Now.AddDays(21);
            Response.Cookies.Add(aCookie);
        }
        else
        {
            string s = aCookie["MyLang"];
            HttpContext.Current.Session["MyCulture"] = aCookie["MyLang"];
        }
 }
第二次它进入“else子句”,因为cookie存在;在我的筛选器中,当它尝试设置culutre时,
Session[“MyCulture”]
为空

   public void OnActionExecuting(ActionExecutingContext filterContext)
    {

        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["MyCulture"].ToString());
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(HttpContext.Current.Session["MyCulture"].ToString());
    }

为什么在ASP.NET MVC应用程序中使用
HttpContext.Current
永远不要使用它。即使在经典的ASP.NETWebForms应用程序中,这也是一种邪恶,但在ASP.NETMVC中,这是一场灾难,它让这个漂亮的web框架失去了所有的乐趣

另外,在尝试使用该值之前,请确保测试该值是否存在于会话中,因为我怀疑在您的情况下,它不是
HttpContext.Current.session
为null,而是
HttpContext.Current.session[“MyCulture”]
。因此:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    var myCulture = filterContext.HttpContext.Session["MyCulture"] as string;
    if (!string.IsNullOrEmpty(myCulture))
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(myCulture);
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(myCulture);
    }
}

因此,您的问题的根源可能是
Session[“MyCulture”]
Session\u Start
方法中没有正确初始化。

相关问题的正确答案:@Darin只是添加它作为参考。非常感谢,是的,问题的根源是aCookie不是空的,但我无法获得它的值。因为第一次(当我删除浏览器的所有cookie时)cookie为null,所以我没有问题,会话也不是null。你说这是邪恶的,不应该被使用。想详细说明一下备选方案吗?@Megacan,我的回答中提供了备选方案:
filterContext.HttpContext.Session
而不是
HttpContext.Current.Session
@DarinDimitrov,你是说
HttpContex.Current
只在动作过滤器中是坏的吗?您的回答更宽泛地说:“为什么在ASP.NET MVC应用程序中使用
HttpContext.Current
?千万不要使用它。”@DarinDimitrov你能解释一下为什么你相信HttpContext吗?当前情况很糟糕-提供替代方案很好,但你有能力通过解释替代方案的原因来帮助其他人获得更好的理解。。。