web-dev-qa-db-ja.com

ASP.NET MVC3-DateTime形式

ASP.NET MVC 3を使用しています。
私のViewModelは次のようになります。

public class Foo
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }
    ...
}

ビューでは、私はこのようなものを持っています:

<div class="editor-field">
    @Html.EditorFor(model => model.StartDate)
    <br />
    @Html.ValidationMessageFor(model => model.StartDate)
</div>

StartDateは正しい形式で表示されますが、値を19.11.2011に変更してフォームを送信すると、「値'19 .11.2011 'はStartDateでは無効です」というエラーメッセージが表示されます。

どんな助けでも大歓迎です!

28
šljaker

dd.MM.yyyyが有効な日時形式であるweb.configファイルのグローバリゼーション要素に適切なカルチャを設定する必要があります。

<globalization culture="...." uiCulture="...." />

たとえば、ドイツ語のデフォルトの形式はde-DEです。


更新:

コメントセクションの要件に従って、アプリケーションのen-USカルチャを維持したいが、日付には別の形式を使用する必要がある。これは、カスタムモデルバインダーを記述することで実現できます。

using System.Web.Mvc;
public class MyDateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(displayFormat) && value != null)
        {
            DateTime date;
            displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the DisplayFormat attribute to parse the date
            if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
            else
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName, 
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

Application_Startに登録します:

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());
42
Darin Dimitrov

あなたのコメントに基づいて、私はあなたが望むすべてが英語の現在のものであるが日付の形式が異なることがわかります(私が間違っている場合は修正してください)。

実際のところ、DefaultModelBinderはサーバーのカルチャ設定をフォームデータに使用します。したがって、サーバーは "en-US"カルチャを使用しているが、日付形式が異なると言えます。

Application_BeginRequestでこのようなことができれば完了です。

protected void Application_BeginRequest()
{
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
}

Web.Config

<globalization culture="en-US" />
10
VJAI

以下のコードをglobal.asax.csファイルに追加しました

protected void Application_BeginRequest()  
{        
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;     
}

以下を<system.web>の下のweb.configに追加しました

<globalization culture="en-US">;
0
Rolwin C