2017-08-27 3 views
0

私は多言語サイトを開発しています。ユーザーが優先言語を変更することができますので、私はそうのような各要求に対して、現在のカルチャを設定します。ASP.NET MVC。多言語サイト。ユーザーの文化にもかかわらず、すべてのDateTimeの不変の文化を設定する

public class EntityBase 
{ 
    protected EntityBase() 
    { 
     DateAdded = DateTime.UtcNow; 
    } 

    [Required] 
    public int Id { get; set; } 

    public DateTime DateAdded { get; set; } 

} 

私の質問:

System.Threading.Thread.CurrentThread.CurrentCulture = /* user preferred culture */ 
System.Threading.Thread.CurrentThread.CurrentUICulture = /* user preferred culture */ 

マイドメインエンティティは、プロパティDateAddedは(レコードが作成された日付を設定する)必要があり私はどのようにして、ユーザーの文化にもかかわらず、不変の文化を持つWebApplication内のすべてのDateTimeとグローバルに対話できますか? DateTimeをデータベース(Entity Frameworkを使用してim)に保存し、それらを更新し、計算し、不変の文化などで文字列を解析したいと思います。必要なときだけユーザーの文化にDateTimeを表示します。

+0

常に日付をUTC形式で保存し、クライアント側のローカル日付に変換してください –

答えて

0

私の最大の問題は、私がCurrentCultureを遅く設定したことです。私はそうのように、コントローラのOnActionExecuting方法でそれを設定します。

public abstract class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var culture = GetUserCultureSomehow(); 
     var cultureInfo = new System.Globalization.CultureInfo(culture); 
     System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
     System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
     base.OnActionExecuting(filterContext); 
    } 
} 

しかし、どのようなアクションが呼び出される前に、それはすなわちModelBinderバインドPOSTリクエストからのデータ、手遅れいくつかのシナリオです。

は、私はこれは文化がリクエストごとに、できるだけ早くに設定されることを保証要求パイプラインアップこのロジック、すなわち:

protected void Application_PostAcquireRequestState(object sender, EventArgs e) 
    { 
     //set culture here; 
    } 

を移動しました。この後、私は文字列をDateTimeに変換することに問題はありません。

関連する問題