web-dev-qa-db-ja.com

URLを介してDateTimeをコントローラーに渡すと、ASP .NET MVC 3(カルチャ)でエラーが発生します

私のアプリケーションは、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)

日付形式を受け入れるために、どうすれば修正できますか?

20
Paul

デフォルトのモデルバインダーには、簡単にはわからない落とし穴がありますが、一度知ってしまえば、同じ間違いを犯すことはなくなります。

  • POSTリクエストを使用すると、デフォルトのモデルバインダーがカルチャ設定を使用して日付を解析します。

  • GETリクエストを使用すると、デフォルトのモデルバインダーはCultureInfo.InvariantCultureを使用して日付を解析し、現在のカルチャ設定を無視します。

GETリクエストを使用し、クエリ文字列パラメーターとして日付を渡すため、URLで送信するときは、不変のカルチャ形式を使用してフォーマットする必要があります。日付をクエリ文字列パラメータとしてフォーマットする正しい方法は、yyyy-MM-ddです。

以下のブログ投稿 をご覧ください。詳細についてはこちらをご覧ください。

54
Darin Dimitrov

私は米国企業と多くの仕事をしている人として、日付の問題について多くの経験を積んでいます。

私の最善のアドバイスは、送信するときに明確な形式を選択することです。

dd-MMM-yyyy

そして

yyyy-MM-dd

安全な賭けであり、DateTime.Parse(obj)によって正常に解析されます。

日付形式を変更するオプションがない場合は、DateTime.ParseExactを確認する必要があります。これにより、目的の正確な形式文字列を指定できます。

9

1つのアプローチは、日付を文字列として受け入れ、コントローラーで正しいロケール/カルチャに操作することです。

2
Kevin Junghans

ビューで@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。

0
Marthijn