ASP.Net MVC переключение культур после компиляции для начальной загрузки - PullRequest
3 голосов
/ 03 ноября 2010

У меня есть гибридное приложение ASP.Net для веб-форм / MVC.На одной из "страниц" / представлений MVC он отображает несколько дат с помощью ToShortDateString () и ToLongDateString ().Они работают правильно в большинстве случаев, но при первой загрузке представления после компиляции приложения они неправильно форматируются.

Я проследил это и проверил культуру текущего потока.В 99% случаев это en-US, но при первой загрузке представления MVC после компиляции он устанавливается в en-GB.Если я сразу же после этого перезагружаю страницу, она возвращается в en-US.

Я попытался установить для культуры и uiculture в файле web.config значение en-US, чтобы оно было правильным, но безуспешно.

У кого-нибудь есть идеи по этому поводу?Ошибка в MVC?

Редактировать (дополнительный код и попытки): Даже если я перейду полностью за борт и включу это в базовый класс представления

public class DNViewPage<T> : ViewPage<T> where T : class
    {

        protected override void OnInit(EventArgs e) {
            base.OnInit(e);
            CultureInfo cultureInfo = new CultureInfo("en-US");
            this.Culture = "en-US";
            this.UICulture = "en-US";
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }

        protected void Page_Load(object sender, EventArgs e) {
            CultureInfo cultureInfo = new CultureInfo("en-US");
            this.Culture = "en-US";
            this.UICulture = "en-US";
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }

        protected override void InitializeCulture() {

            CultureInfo cultureInfo = new CultureInfo("en-US");
            this.Culture = "en-US";
            this.UICulture = "en-US";
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;

            base.InitializeCulture();
        }
    }

и включу его в Интернет.config

<globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="en-US" culture="en-US"/>

и это в заголовке файла .aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Culture="en-US" UICulture="en-US"

Опять же, это только при начальной загрузке после компиляции кода, когда эта страница загружается впервые.На другие страницы веб-форм это не влияет, даже если они происходят от System.Web.Mvc.ViewPage.Все последующие нагрузки правильно относятся к культуре.Простое изменение файла .aspx не приводит к этому, код c # должен быть скомпилирован, чтобы вызвать это.

Дополнительные данные: у меня он отслежен до метода Render.До метода Render культура была en-US, а затем en-GB (опять же только при начальной загрузке страницы после компиляции).

Ответы [ 5 ]

1 голос
/ 17 мая 2011

Оказалось, что это вызвано зависимостью от устаревшей сторонней библиотеки .dll.Как только я выследил его и получил обновленный .dll, все снова было хорошо.

1 голос
/ 15 мая 2011

По вашему мнению, попробуйте создать базовое представление - тогда для этого конкретного представления наследуйте его, как здесь: Как глобализировать представления ASP.NET MVC (в частности, десятичные разделители)? как бы вы ни былибольше похоже на:

protected override void InitializeCulture()
{
    base.InitializeCulture();
    CultureInfo cultureInfo = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentUICulture = cultureInfo;
}

Я считаю, что были некоторые проблемы с корректной работой ключа глобализации.

0 голосов
/ 16 мая 2011

Мое первое наблюдение за вашей страницей .aspx,

Вы не наследуете свою страницу ASPX от базового класса ViewPage. Попробуйте добавить это в тег заголовка страницы ASPX.

Inherits="XXX.Views.DNViewPage<YYY.Models.zzzViewModel>"

так должно выглядеть,

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="XXX.Views.DNViewPage<YYY.Models.zzzViewModel>" %>
0 голосов
/ 15 мая 2011

Вы пытались сделать базовый контроллер? Я изменил культуру с приложением на работе, оно работало довольно хорошо.

public class BaseController : Controller
{
    public string ActionName;
    public string ControllerName;

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //Switch the language in here?
       CultureInfo cultureInfo = new CultureInfo("en-US");
        this.Culture = "en-US";
        this.UICulture = "en-US";
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = cultureInfo;

        base.OnActionExecuting(context);
    }
}
0 голосов
/ 04 ноября 2010

как вы установили культуру в веб-конфигурации?

вы используете ключ "глобализации"?

посмотрите на:

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...