0

TimeSpanASP.NET MVC 4 アプリケーションには、null 許容プロパティを含むビュー モデルがあります。

[DisplayName("My time")]
public TimeSpan? MyTime { get; set; }

ビューの入力要素にバインドされています。

@Html.EditorFor(model => model.MyTime)

入力ボックスは、カスタム エディター テンプレートの助けを借りてレンダリングされますTimeSpan.cshtml

@model Nullable<System.TimeSpan>

@Html.TextBox("", (Model.HasValue
    ? Model.Value.ToString(@"hh\:mm") : string.Empty),
    new { @class = "text-box single-line hasTimepicker" data_timepicker = true })

ここで、次の 2 種類の無効な時間を入力してページを送信すると、モデル バインダーの動作が次のように異なります。

  • 文字を入力する場合、コレクションにドリルダウンすると、このプロパティ"a"の入力要素に、メッセージ ( ) に設定されたプロパティがあり、プロパティはです。のバインドされた値はです。ModelErrorModelState.ValuesErrorMessage"The value \"a\" for \"My time\" is invalid."ExceptionnullMyTimenull

    これErrorMessageは、ページの検証の概要に表示されます。

  • たとえば"25:12"、入力要素に無効な時間を入力すると、ModelErrorこのプロパティのプロパティはErrorMessage空の文字列に設定されますが、Exceptionプロパティはタイプの例外に設定され、タイプInvalidOperationExceptionの内部例外により、次のいずれかが原因で分析できなかっOverflowExceptionたことがわかりますTimeSpan数値コンポーネントが有効な範囲外です。のバインドされた値はMyTimeですnull

    繰り返しErrorMessageますが、ページの検証の概要に表示されます。しかし、それは空なので、あまり役に立ちません。

理想的には、無効な入力の 2 番目のケースでは、最初のケースのように同じ種類のエラー メッセージを表示することをお勧めします"The value \"25:12\" for \"My time\" is invalid."

どうすればこの問題を解決できますか?

編集

カスタム検証属性は、モデル バインダーが既に無効な値を検出している場合、上記の例の無効な入力に対して呼び出されないため、明らかにここでは役に立ちません。私はそのアプローチを試みましたが、成功しませんでした。

4

2 に答える 2