ASP.NET MVC تبديل الثقافات بعد الترجمة للتحميل الأولي
-
28-09-2019 - |
سؤال
لديّ تطبيق ASP.NET Web Forms/MVC. على واحدة من "الصفحات"/وجهات النظر MVC ، جعلتها تقدم مجموعة من التواريخ باستخدام toshortdatestring () و tolongdatestring (). هذه تعمل بشكل صحيح معظم الوقت ، لكن في المرة الأولى التي أقوم فيها بتحميل العرض بعد تجميع التطبيق ، يتم تنسيقها بشكل غير صحيح.
تتبعت هذا لأسفل وفحصت ثقافة الموضوع الحالي. بالنسبة إلى 99 ٪ من الوقت ، فإنه في الولايات المتحدة ، ولكن في الحمل الأول من عرض MVC بعد تجميعه ، تم تعيينه على GB. إذا قمت بإعادة تحميل الصفحة مباشرة بعد ذلك ، فقد عادت إلى الولايات المتحدة.
لقد حاولت تعيين الثقافة وزراعة uic في ملف 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# للتسبب في ذلك.
المزيد من البيانات: لقد تعقبها إلى طريقة العرض. قبل طريقة العرض ، تكون الثقافة en-us وبعد ذلك تكون EN-GB (مرة أخرى فقط على pageload الأولي بعد التجميع).
المحلول 2
اتضح أن هذا ناتج عن التبعية على طرف ثالث. بمجرد أن قمت بتتبعه ، وحصلت على التحديث. dll ، كان كل شيء على ما يرام مرة أخرى.
نصائح أخرى
من وجهة نظرك ، حاول إنشاء طريقة عرض قاعدة - ثم يرث هذا العرض بالذات كما حدث هنا: كيفية عولمة ASP.NET MVC وجهات نظر (فواصل عشرية على وجه الخصوص)؟ومع ذلك سيكون لك أكثر مثل:
protected override void InitializeCulture() { base.InitializeCulture(); CultureInfo cultureInfo = new CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = cultureInfo; }
أعتقد أنه كانت هناك بعض المشكلات مع مفتاح العولمة تعمل بشكل صحيح.
كيف قمت بتعيين الثقافة في تكوين الويب؟
هل تستخدم مفتاح "العولمة"؟
القي نظرة على:
ملاحظتي الأولى لصفحة .aspx الخاصة بك ،
أنت لا ترث صفحة ASPX الخاصة بك من فئة Pare 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);
}
}