HttpContext.Current.Session在MVC 3应用程序中为null

use*_*648 4 session-cookies asp.net-mvc-3

我有一个双语MVC 3应用程序,我使用cookie和会话来保存文件中的Session_start方法"文化" Global.aspx.cs,但在它之后直接,会话为空.

这是我的代码:

    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"];
        }
 }
Run Code Online (Sandbox Code Playgroud)

第二次进入"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());
    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 13

你为什么HttpContext.Current在ASP.NET MVC应用程序中使用?永远不要使用它.即使在经典的ASP.NET webforms应用程序中,这也是邪恶的,但在ASP.NET MVC中,这是一个让这个漂亮的Web框架带来所有乐趣的灾难.

还要确保在尝试使用它之前测试会话中是否存在该值,因为我怀疑在您的情况下它不是HttpContext.Current.Sessionnull,但是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以问题的根源可能Session["MyCulture"]是在Session_Start方法中没有正确初始化.

  • @Megacan,替代方法在我的回答中提供:`filterContext.HttpContext.Session`而不是`HttpContext.Current.Session`. (5认同)
  • @DarinDimitrov,您是说`HttpContex.Current` 仅在动作过滤器中是不好的吗?您的回答更广泛地说:“您为什么在 ASP.NET MVC 应用程序中使用 `HttpContext.Current`?永远不要使用它。” (3认同)
  • 你说这是邪恶的,不应该被使用.注意详细说明替代方案? (2认同)
  • @DarinDimitrov 你能解释一下*为什么*你认为 HttpContext.Current 不好 - 提供替代方案很好,但你有能力通过解释替代方案的原因来帮助其他人更好地理解...... (2认同)