2011-11-14 7 views
2

北米のフォーマットがの.NET DataAnnotationとグローバリゼーションの問題(サーバー側)日付の

日付形式があるオーストラリアのために、私はプロジェクトに取り組んでいます(asp.net MVC 2)D/MM/MM/DD/YYYYですYYYY私は.NETが適切なフォーマットで日付をレンダリングビューで

 <globalization 
     fileEncoding="utf-8" 
     requestEncoding="utf-8" 
     responseEncoding="utf-8" 
     culture="en-AU" 
     uiCulture="en-AU" 
     enableClientBasedCulture="true" 
    /> 

を持ってweb.configファイルで

- "EN-AU" が、私は14/11/2011でフォームを送信すると、私のModelState.IsValidとデートFalseに等しくなります。

"en-AU"形式の日付を適切に検証するためにデータアノテーションをどのように教えるには?

//更新が

はちょうどのみ

using(Html.BeginForm("Search", "form", FormMethod.Post)) //Works 
using(Html.BeginForm("Search", "form", FormMethod.Get)) //Does'n work 

** GETに関連するその問題を発見し、それは.NETのバグであるように見えます!

私は

ありがとう**新しいMVC2/3プロジェクト

私がGETを使用する場合、MVCの結合は、現在のカルチャを使用しないで試してみました。

答えて

1

最後に、数十のブログ投稿と記事に感謝しています。完璧に働きます。さらに、日付だけでなく、それを適用することもできます。

//Global.asax.cs 
protected void Application_Start() 
{ 
    ModelBinders.Binders[typeof (DateTime)] = new ForceCultureModelBinder<DateTime>(); 
    ModelBinders.Binders[typeof(DateTime?)] = new ForceCultureModelBinder<DateTime>(); 
} 

とクラス

public class ForceCultureModelBinder<T> : IModelBinder where T : struct 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext == null) 
      throw new ArgumentNullException("bindingContext"); 

     T? valueAttempt = GetA(bindingContext); 
     return valueAttempt == null ? (object) null : valueAttempt.Value; 
    } 

    private T? GetA(ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     if (valueResult == null) 
      return null; 

     T? result; 
     try 
     { 
      result = (T?) valueResult.ConvertTo(typeof (T), Thread.CurrentThread.CurrentCulture); 
     } 
     catch (Exception) 
     { 
      bindingContext.ModelState.AddModelError(
        bindingContext.ModelName, 
        ex.InnerException.Message); 
      return null; 
     } 

     return result; 
    } 
} 
+0

あなたのexempleは、ユーザロケールを使ってパラメータ入力値を変換するのに便利です。私は自分のアプリケーションの1つに使っています。エラーメッセージを表示するためにキャッチする。 –

0

Hanselman氏は、彼は次のように何かありません。このクライアント側の処理方法に関する良い記事、持っている:私はプラグインが今や見つかっ(グローバル化と呼ばれていると信じていますhttp://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

$(document).ready(function() { 
     //Ask ASP.NET what culture we prefer 
     $.getJSON('/locale/currentculture', function (data) { 
      //Tell jQuery to figure it out also on the client side. 
      $.global.preferCulture(data); 
     }); 
    }); 

ソースをhere)、APIは似ていても同じでなければなりません。

+0

私の問題は、サーバー側です。 (私は今のところブラウザ側に触れていませんが)フォーム提出(同じ値を提示した後)のサーバー側で、データ注釈エンジンがen-USのデータを期待しています – Cherven

6

この動作は仕様です。 GETリクエストをすると、URLに日付が入ります。 ASP.NET MVCは、URLの日付が不変の文化であると仮定します。

なぜですか?

私は次のURL:/ posts/01-11-2011 /を作成して送信するとします。それはあなたにとってどういう意味ですか?

2011年1月11日の投稿を表示するということは、それが私の文化に役立つからです。しかし、あなたの文化はおそらく2011年11月1日にそれを示しています。は固有にのリソースを特定する必要があります。誰がそれを見ているかによって、同じURLは異なる意味を持つべきではありません。

モデルバインダーはURLの値を現在のカルチャに変換しないと決めましたが、の値をフォームポストから変換します。フォームの投稿は送信できず、一般的にユーザーの入力を表すため、これはわかりやすいものでした。

+0

ありがとう、それは状況を説明します。私はPATHの一部であるが、私の場合urlは/posts?...&date=01-11-2011です。 get paramのために文化は機能していると思います。そして、muの場合はGETする必要があります。 私はすでにデータを正しく解析するためにmvcに教える方法を見つけるのに2日を費やしています。いいえ結果はまだありません:( あなたのサンプルをいくつか見せてもらえますか? – Cherven