1

Razor で ASP.NET MVC 4 を使用しています。検証メッセージが表示されます (テキスト ボックスに 20.10.2013 があるとします):

The field MyNullableDateField must be a date

私のモデルコード:

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

私のカミソリ:

@Html.EditorFor(m => m.MyNullableDateField, new { @class = "date" })

私のエディターテンプレート:

@model DateTime?
@Html.TextBox(string.Empty, (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "date" })

なぜこのようなエラーが発生するのですか?

4

1 に答える 1

2

アンドレイ、

表示形式は、ほとんどの場合、ビューで使用する Html ヘルパーを使用するためのものです。

必要なのは (@CodeCaster で正しく言及されているように) DateTime タイプのカスタム モデル バインダーです。カスタム モデル バインダーは型ごとに登録できるため、MVC ランタイムが同じ型のコントローラー アクションで引数を検出するたびに、カスタム モデル バインダーを呼び出して、ポストされた値を正しく解釈し、型を作成します。

以下は、DateTime のサンプル カスタム モデル バインダー タイプです。

public class DateTimeModelBinder : DefaultModelBinder
{
    private string _customFormat;

    public DateTimeModelBinder(string customFormat)
    {
        _customFormat = customFormat;
    }

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    // use correct fromatting to format the value
        return DateTime.ParseExact(value.AttemptedValue, _customFormat, CultureInfo.InvariantCulture);
    }
}

ここで、DateTime に新しいモデル バインダーを使用するように MVC に指示する必要があります。これを行うには、新しいモデル バインダーを Application_Start に登録します。

protected void Application_Start()
{
    //tell MVC all about your new custom model binder
    var binder = new DateTimeModelBinder("dd.MM.yyyy");
    ModelBinders.Binders.Add(typeof(DateTime), binder);
    ModelBinders.Binders.Add(typeof(DateTime?), binder);
}

クレジットは、datetime のカスタム モデル バインディングに関する優れた記事 ( http://blog.greatrexpectations.com/2013/01/10/custom-date-formats-and-the-mvc-model-binder/ )に当てはまります。

これが正しい部分から始めるのに役立つことを願っています

于 2013-06-15T01:26:06.927 に答える