2

コントローラにPOSTされる通常のフォームがあります。南米向けのアプリなので、日付は日/月/年の形式で入力する必要があります。現在のカルチャUIをスペイン語(ペルー)に強制的に設定しています。MVC3および4ベータで試してみました。

コントローラコードは次のとおりです。

[HttpPost]
public ActionResult Create(EditPatientViewModel model)
{
   Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-PE");
   if (ModelState.IsValid) {
       // never reaches in here if date submitted as day/month/year
   }
}

デバッグしてModelStateエラーを確認すると、CurrentThread.CurrentUICultureがes-PEに設定されていることを確認できますが、エラー内のカルチャはまだen-USに設定されています。

ModelState検証も変更するにはどうすればよいですか?

4

1 に答える 1

4

web.configのグローバリゼーションをes-PEに設定します。

<configuration>
   <system.web>
      <globalization fileEncoding="utf-8" 
                     requestEncoding="utf-8" 
                     responseEncoding="utf-8" 
                     culture="es-PE"
                     uiCulture="es-PE"/>
   </system.web>
</configuration>

そして、それは正常に機能し、投稿と検証が行われるはずです。

アップデート

何らかの理由でModelStateが日付を正しく解釈していない場合は、次のようにすることができます。

ModelState[n].Value.Culture = {es-PE};

検証が行われる前。

アップデート

デフォルトのバインダーを変更して、独自のバインダーを作成することもできます。

public class MyDateTimeBinder : IModelBinder
{
  public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
     var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
      return date;    
   }
}

置く

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeBinder());

Global.asaxのApplication_Start()にあります。

よろしく。

于 2012-04-14T18:28:53.607 に答える