最近 MVC3 から 4 にアップグレードした後、日時に関する問題が発生しています。次のような日付プロパティを表示します。
<%: Html.DisplayFor(m => m.InvoiceDate, "datetime")%>
「datetime」は、次のような表示テンプレートです。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime?>" %>
<%: Model.HasValue ? Model.Value.ToString("dd/MM/yy", null) : ""%>
私の global.asax ファイルでは、次のモデル バインダーを登録します。
ModelBinders.Binders.Add(typeof(DateTime), new SMEEDI.Portal.Common.DateTimeModelBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new SMEEDI.Portal.Common.DateTimeModelBinder());
次のようになります。
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
if (String.IsNullOrEmpty(date))
return null;
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName));
try
{
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-NZ");
return DateTime.Parse(date, CultureInfo.CurrentCulture.DateTimeFormat);
}
catch (Exception)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName));
return null;
}
日時はビューに正しく表示されますが、フォームが送信されると、日付は次のように返されます: "7/20/2013 12:00:00 AM" と DateTimeModelBinder が Format Exception: String was not registered as a としてスローされます。有効な日時。(ニュージーランドでは月と日が逆です)。
なぜこの形で戻ってくるのですか?なぜそれを解析できないのですか?MVC 4 にアップグレードすると、なぜこのようなことが起こったのですか? NZ形式で返すにはどうすればよいですか? 解析時にカルチャを指定しないほうがよいのですが、これは以前の MVC バージョンで必要だったのでしょうか?