私のアプリケーションは、web.configでpt-BRカルチャ(日付はdd-mm-yyyy)で設定されています。
<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" />
私のシステムで作成されたすべてのDateTimeは正しい形式ですが、次のようなコントローラーメソッドを作成しました。
public ActionResult Test(DateTime date)
{
}
日付が次のようにポルトガル語-br形式の場合、ブラウザでそのメソッドを直接呼び出すとnullが渡されます。
mysite/Test/?date=19/01/2012 => date = null in my controller
mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy)
日付形式を受け入れるために、どうすれば修正できますか?
デフォルトのモデルバインダーには、簡単にはわからない落とし穴がありますが、一度知ってしまえば、同じ間違いを犯すことはなくなります。
POSTリクエストを使用すると、デフォルトのモデルバインダーがカルチャ設定を使用して日付を解析します。
GETリクエストを使用すると、デフォルトのモデルバインダーはCultureInfo.InvariantCulture
を使用して日付を解析し、現在のカルチャ設定を無視します。
GETリクエストを使用し、クエリ文字列パラメーターとして日付を渡すため、URLで送信するときは、不変のカルチャ形式を使用してフォーマットする必要があります。日付をクエリ文字列パラメータとしてフォーマットする正しい方法は、yyyy-MM-dd
です。
以下のブログ投稿 をご覧ください。詳細についてはこちらをご覧ください。
私は米国企業と多くの仕事をしている人として、日付の問題について多くの経験を積んでいます。
私の最善のアドバイスは、送信するときに明確な形式を選択することです。
dd-MMM-yyyy
そして
yyyy-MM-dd
安全な賭けであり、DateTime.Parse(obj)によって正常に解析されます。
日付形式を変更するオプションがない場合は、DateTime.ParseExact
を確認する必要があります。これにより、目的の正確な形式文字列を指定できます。
1つのアプローチは、日付を文字列として受け入れ、コントローラーで正しいロケール/カルチャに操作することです。
ビューで@Html.Action(..)
を使用して同じ問題が発生しました。この状況では、モデルにDateTime
を配置することで解決できます。
_public class MyModel
{
public DateTime Value {get;set;}
}
_
とビューで:
_@Html.Action("MyAction", new { myModel })
_
MyModel
のインスタンスの周りの_new { }
_に注意してください。この方法では、DateTime
は文字列に変換されません。このソリューションは、MVCがHtml.Action()
を実行しているためHtml.ActionLink()
およびnot for Url.Action()
またはmyModel.ToString()
に対してのみ機能します。 URL。