4

ビュー モデルの DateTime フィールドを 2 つの個別のフォーム フィールド (日付と時刻) にレンダリングしています。私のビューには次のコード行があります。

@Html.TextBox("EndTime.Date", Model.EndTime.ToShortDateString())

次のようにレンダリングされます。

<input data-val="true" data-val-date="The field Date must be a date." 
 data-val-required="The Date field is required." id="StartTime_Date"
 name="StartTime.Date" type="text" value="29/09/2012">
  • この入力フィールドに data-* 属性が追加されているのはなぜですか?
  • なぜそれがデートだとさえ思うのですか?

この予期しない検証の興味深い副作用は、フィールドが日付として検証されることです (偶然にもこれが必要です) が、jquery が間違った日付形式を使用することを決定しているため、エラーが発生します:

「フィールド日付は日付でなければなりません。」


更新: 「間違った日付形式」エラーは、Chrome のバグが原因であることが判明しました。JQuery 検証ライブラリは新しい を作成して日付を検証し、Date()Chrome は常に日付を en-US として解析するように見えるため (ロケール/言語設定を完全に無視して)、en-UK の日付を入力すると失敗していました。

4

3 に答える 3

3

そのプロパティに検証属性を明示的に追加していなくても、不要な検証フィールドが表示される場合があります。

これをApplication_Start()に追加することで、これを無効にできます。

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

さらに、問題を解決する可能性があるのは、プロパティModel.EndTimeでnullを許可する必要があることです。

DateTime? EndTime;
于 2012-10-02T14:58:17.343 に答える
1

この入力フィールドに data-* 属性が追加されているのはなぜですか?

アプリケーションで目立たない検証を有効にしたためです。デフォルトでは、MVC 検証システムは、値の型 (整数、日時) の必要なデータ型とデータ型の両方のクライアント側の検証を有効にします。

なぜそれがデートだとさえ思うのですか?

文字列をヘルパー メソッドに渡すと、 にその名前のプロパティが含まれてHtml.TextBoxいるかどうかがチェックされます。この場合、には name のプロパティがあり、タイプはです。ModelModelEndTimeDateTime

EndTime.Dateあなたはまだタイプを表しているDateTime(日付コンポーネントのみを含むタイプDateTimeのプロパティを持っている)ことを渡しているので、MVCによって2つの検証が有効になっています。DateDateTime

日付と時刻を格納するために、2 つの異なるプロパティを作成することをお勧めします。

于 2012-10-04T10:58:53.637 に答える
1

モデルオブジェクトと同じフォーム名を使用すると、同様の問題が発生しました...フォームはそれをモデルに自動的に関連付けます。

フォームの送信後に日付/時刻の値を自分で処理することを計画している場合は、モデルにフィールドを作成できます

private string _endDate;
public string EndDate 
    {
        get
        {
            if (_endDate == null)
                _endDate = EndTime.ToShortDateString();

            return _endDate;
        }
        set
        {
            _endDate = value;
        }
    }

そして、EndDate をテキスト ボックス フィールドとして使用するか、TextBoxFor を使用してモデルにマップします。その後、post または set アクセサーでデータを処理できます。

于 2012-10-01T17:01:53.380 に答える