HttpContext.Current.Session является нулевым в приложении MVC 3 - PullRequest
4 голосов
/ 09 октября 2011

У меня есть двуязычное приложение 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"];
        }
 }

и второй раз он входит в «условие else», потому что cookie существует; Внутри моего фильтра, когда он пытается установить источник, 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());
    }

1 Ответ

13 голосов
/ 09 октября 2011

Почему вы используете HttpContext.Current в приложении ASP.NET MVC? Никогда не используйте его.Это зло даже в классических приложениях веб-форм ASP.NET, но в ASP.NET MVC это катастрофа, которая извлекает все удовольствие из этой замечательной веб-платформы.

Также убедитесь, что вы проверяете, присутствует ли значение в сеансе, прежде чем пытаться его использовать, так как я подозреваю, что в вашем случае это не HttpContext.Current.Session, который является нулевым, а 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_Start.

...