0

カスタムのクライアント側検証を実装しようとしていますが、機能していません。Codeproject http://www.codeproject.com/Articles/275056/Custom-Client-Side-Validation-in-ASP-NET-MVC3の記事に基づいています

ここでもSOを見ましたが、正しい方法で実装していると思いますが、何かを見落としています。私の目標は、日付を検証することです(必須、日付形式で、フォームの別の日付より前ではありません)。最初の 2 つはデータ注釈で実行でき、最後の 1 つはカスタム検証で行う必要があります。

基本クラスにいくつかのデータ注釈があります (ClassLibrary は VB.NET にあります):

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(CM_CONTRACTVALIDATIONData))>
Partial Public Class CM_CONTRACTACTIVATION
    '...
End Class

Public Class CM_CONTRACTVALIDATIONdata
'...
<DataType(DataType.Date)>
<Required()>
Public Property TakeBackDeviceWhen
'..
End Class

JavaScript ファイルに、カスタム メソッドを追加しました。

//validation
$.validator.addMethod("checkPickupDate", function (value, element) {
    return false;
});
$("#form").validate({
    rules: {
        TakeBackDeviceWhen: {
            checkPickupDate: true
        }
    },
    messages: {
        TakeBackDeviceWhen: {
            checkPickupDate: "Test"
        }
    }
}
);

私の chtml ファイルは次のとおりです。

@Html.TextBox("TakeBackDeviceWhen", Model.TakeBackDeviceWhen.HasValue ? Model.TakeBackDeviceWhen.Value.ToShortDateString() : "", new { style = "Width: 200px" })

結果の HTML は次のようになります。

<input id="TakeBackDeviceWhen" class="hasDatepicker" type="text" value="" style="Width: 200px" name="TakeBackDeviceWhen" data-val-required="The TakeBackDeviceWhen field is required." data-val="true">

タイプ検証もカスタム検証も実装されていないようです。

何がうまくいかないのですか?

4

1 に答える 1

1

わかりました、解決しました。私は願います :-)

今日学んだこと: (1) EditorFor を使用しないでください: MVC テンプレートから scaffold すると、入力フィールドが EditorFor に生成されます。カスタムの控えめな検証タグを追加できないようです。そのため、TextBoxFor に変更するまで、これを修正しようとしていました。

(2) jQuery にカスタム検証メソッドを追加できますが、目立たない検証と組み合わせることはできません。カスタム メソッドを追加したら、目立たないアダプターにも追加する必要があります。そして、一番下に jQuery を追加することを忘れないでください:-s (これはjQuery.validator.unobtrusive.adapters.addMinMax ラウンドトリップから取得しましたが、MVC3 では機能しません)

$(function () {
$.validator.addMethod("checkpickupdate", function (value, element) {
    if (value == "20/09/2012") {
        return false;
    } else {
        return true;
    }
});

$.validator.unobtrusive.adapters.addBool("checkpickupdate");
} (jQuery));

(3) htmlAttributes の入力フィールドに検証タグを追加します。

@Html.TextBox("TakeBackDeviceWhen", Model.TakeBackDeviceWhen.HasValue ? Model.TakeBackDeviceWhen.Value.ToShortDateString() : "",
                new { 
                    style = "Width: 200px", 
                    data_val = "true", 
                    data_val_required = "verplicht!",
                    data_val_date = "moet datum zijn",
                    data_val_checkpickupdate = "wow"
                 })

(4) データ型のデータ注釈は検証を強制しません。(3)のように追加する必要があります。次のようなカスタム ValidationAttribute を追加できます (サーバー側の検証用)。

public class MustBeDateAttribute : ValidationAttribute {
    public override bool IsValid(object value) {
        try
        {
            DateTime dte = DateTime.Parse(value.ToString());
            return true;
        }
        catch (Exception)
        {
            return false;
            throw;
        }
    }
}

そして、これは結果のhtml出力です:

<input type="text" value="" style="Width: 200px" name="TakeBackDeviceWhen" id="TakeBackDeviceWhen" data-val-required="required!" data-val-date="has to be a date" data-val-checkpickupdate="custom error" data-val="true" class="hasDatepicker valid">

ClassLibrary をさまざまなプロジェクトで使用しているため、dataannotations メタデータをクラス ライブラリから分離しようとしています (おそらく依存関係リゾルバーを使用)。

于 2012-09-20T09:47:30.827 に答える