ASP.NET MVC Коммутационные культуры после компиляции для начальной нагрузки
-
28-09-2019 - |
Вопрос
У меня есть Hybrid ASP.NET Web Forms / MVC приложение. На одном из MVC «страницы» / просмотров у меня есть куча датов, используя ToshortDateString () и TolongdateString (). Они работают правильно большую часть времени, но в первый раз я загружаю вид после составления приложения, они отформатированы неправильно.
Я проследил это и проверил культуру текущей нити. В течение 99% времени это США, но на первой нагрузке MVC View после составления его установлено значение EN-GB. Если я перезагрузим страницу сразу после этого, вернулась к нам.
Я попытался установить культуру и заборку в файле web.config, чтобы сделать его, чтобы заставить его быть правильным, но не повезло.
У кого-нибудь есть идеи на этом? Ошибка в 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();
}
}
и включить это в web.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 культуру - это США и впоследствии она EN-GB (опять же только на начальной нагрузке после компиляции).
Решение 2
Это оказалось вызвано зависимостью от устаревшего, третьей стороной .dll. Как только я отслеживал его, и получил обновленный .dll, все было хорошо снова.
Другие советы
По вашему мнению, попробуйте создать базовый вид - затем для этого конкретного представления наследует от него, как это сделано здесь: Как глобализировать виды ASP.NET MVC (в частности, десятичные сепараторы)?Однако ваши бы больше похоже на:
защищенное переопределение void инициализирует () {base.initializeculture (); CultureInfo CultureInfo = New CultureInfo («EN-US»); Thread.CurrentThread.Currenturecture = CultureInfo; }
Я считаю, что были некоторые проблемы с ключом глобализации работают правильно.
Как вы установили культуру в веб-конфигурацию?
Вы используете ключ «Глобализацию»?
посмотри на:
Мое первое наблюдение за вашу страницу .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>" %>
Вы пытались сделать базовый контроллер? Я изменил культуру с приложением на работе на нем довольно хорошо.
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);
}
}