2

最近 MVC3 から 4 にアップグレードした後、日時に関する問題が発生しています。次のような日付プロパティを表示します。

<%: Html.DisplayFor(m => m.InvoiceDate, "datetime")%>&nbsp; 

「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 バージョンで必要だったのでしょうか?

4

1 に答える 1

0

これはトリッキーな領域です。多くの要因が関係しています。

理由の 1 つは、Web ブラウザーが米国英語に設定されていることです。

スレッドのカルチャ情報を設定してみてはいかがでしょうか。を使用して、Thread.CurrentThread.CurrentCultureまたは web config で実行できます<globalization enableClientBasedCulture="true" culture="auto:en-NZ" uiCulture="auto:en"/>

于 2013-07-11T16:21:45.113 に答える