.net MVC国际日期来自已发布表单的模型验证

时间:2012-04-14 18:24:48

标签: asp.net-mvc validation

我有一个常规表单,它被POST到控制器。日期必须以日/月/年格式输入,因为它是南美洲的应用程序。我强迫将当前的文化UI设置为西班牙语 - 秘鲁。试过MVC 3和4 beta。

这是控制器代码:

[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错误时,它们内部的文化仍然设置为en-US,即使我可以验证CurrentThread.CurrentUICulture是否设置为es-PE。

如何使ModelState验证也发生变化?

1 个答案:

答案 0 :(得分: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()中。

问候。