1. ホーム
  2. asp.net-mvc

[解決済み] MVCのDateTimeバインディングで日付の書式が正しくない場合

2022-06-09 13:07:11

質問

Asp.net-MVCでは、DateTimeオブジェクトの暗黙的なバインディングが可能になりました。私は以下のようなアクションを持っています。

public ActionResult DoSomething(DateTime startDate) 
{ 
... 
}

これは、ajax呼び出しからの文字列をDateTimeに変換することに成功しています。ただし、日付の形式はdd/MM/yyyyを使用しています。MVCはMM/dd/yyyyに変換しています。 たとえば、文字列 '09/02/2009' を指定してアクションに呼び出しを送信すると、DateTime は '02/09/2009 00:00:00' (ローカル設定での 9 月 2 日) になります。

私は、日付フォーマットのために独自のモデルバインダーをロールバックしたいわけではありません。しかし、MVC が私のためにこれを行うことができる場合、文字列を受け入れるためにアクションを変更し、次に DateTime.Parse を使用しなければならないのは不要なように思えます。

DateTimeのデフォルトモデルバインダーで使用される日付フォーマットを変更する方法はありますか?デフォルトのモデルバインダーは、とにかくローカライゼーションの設定を使用すべきではありませんか?

どのように解決するのですか?

もっと徹底的にググって答えを見つけたところです。

Melvyn Harbour は、なぜ MVC が日付で動作するのか、そして必要に応じてこれを上書きする方法について、徹底的な説明をしています。

http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx

<ブロッククオート

パースする値を探すとき、フレームワークは特定の順序で探します。

  1. RouteData (上記には表示されていません)
  2. URIクエリ文字列
  3. リクエストフォーム

しかし、これらのうち最後のものだけがカルチャを認識します。ローカライゼーションの観点から、これには非常に良い理由があります。私が航空会社のフライト情報を表示する Web アプリケーションを書き、オンラインで公開したとします。ある日付のフライトを調べるには、その日のリンクをクリックします。 http://www.melsflighttimes.com/Flights/2008-11-21 のようなもの)をクリックして、ある日のフライトを調べ、そのリンクをアメリカにいる私の同僚にメールで送りたいのです。私たち二人が同じページのデータを見ることを保証する唯一の方法は、InvariantCultureを使用することである。対照的に、私がフライトを予約するためにフォームを使用している場合、すべてがタイトなサイクルで起こっている。データはフォームに書き込まれるときにCurrentCultureを尊重することができるので、フォームから戻ってくるときにも尊重する必要があります。