3

3つのセレクターからのRemoteValidation/jQueryを使用して生年月日を検証したいと思います。ユーザーが18歳以上かどうかを確認したい。しかし、ATMはそれらをグループ化するのに問題があるため、それらは無効/有効であり、エラーメッセージは1つだけです。

目標:3つの要素のいずれかを変更したときに、同じRemoteValidationを使用して3つの要素すべてをグループ(jqueryバリデーターグループ)として検証したいと思います。

誰かがこれを解決する方法を知っていますか?

意見:

@Html.DropDownListFor(m => m.BirthYear, Model.BirthYearList)
@Html.DropDownListFor(m => m.BirthMonth, Model.BirthMonthList)
@Html.DropDownListFor(m => m.BirthDay, Model.BirthDayList)

モデル

[Remote("IsValidCustomerBirthDate", "JsonValidation", AdditionalFields = "BirthDay, BirthMonth", ErrorMessageResourceName = "InvalidCustomerBirthDate", ErrorMessageResourceType = typeof(Error))]
[Required]
public int BirthYear { get; set; }

[Remote("IsValidCustomerBirthDate", "JsonValidation", AdditionalFields = "BirthYear,  BirthDay", ErrorMessageResourceName = "InvalidCustomerBirthDate", ErrorMessageResourceType = typeof(Error))]
[Required]
public int BirthMonth { get; set; }

[Remote("IsValidCustomerBirthDate", "JsonValidation", AdditionalFields = "BirthYear, BirthMonth", ErrorMessageResourceName = "InvalidCustomerBirthDate", ErrorMessageResourceType = typeof(Error))]
[Required]
public int BirthDay { get; set; }

RemoteValidation関数

[HttpGet]
public JsonResult IsValidCustomerBirthDate(int birthYear, int birthMonth, int birthDay)
    {
        try
        {
            var dateOfBirth = new DateTime(birthYear, birthMonth, birthDay);
            var ageCalculator = new AgeCalculator();

            if (ageCalculator.GetAge(dateOfBirth) >= AgeLimit)                   
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
        }
        catch (ArgumentException)
        {

        }            

        return Json(false, JsonRequestBehavior.AllowGet);
    }

私はvalidate()のグループで苦労していますが、どこにも行きません。

あらゆる種類の入力に感謝します。(私はフロントエンド開発者なので、複雑なC#コードの場合はもっと参考にしてください)。

よろしく/マグナス

4

2 に答える 2

0

また、kpull1 が言及したのと同じアプローチを採用しています。彼の答えを少し拡張して、「追加フィールド」を持つ各リモート検証要素を見つけ、それらのフィールドの 1 つが変更されるたびにその要素の検証を開始するこのヘルパー メソッドを作成しました。

// I hate naming things
function initializeRemotelyValidatingElementsWithAdditionalFields($form) {
    var remotelyValidatingElements = $form.find("[data-val-remote]");

    $.each(remotelyValidatingElements, function (i, element) {
        var $element = $(element);

        var additionalFields = $element.attr("data-val-remote-additionalfields");

        if (additionalFields.length == 0) return;

        var rawFieldNames = additionalFields.split(",");

        var fieldNames = $.map(rawFieldNames, function (fieldName) { return fieldName.replace("*.", ""); });

        $.each(fieldNames, function (i, fieldName) {
            $form.find("#" + fieldName).change(function () {
                // force re-validation to occur
                $element.removeData("previousValue");
                $element.valid();
            });
        });
    });
}

次のように関数を呼び出します。

$(document).ready(function() {
    initializeRemotelyValidatingElementsWithAdditionalFields($("#myFormId"));
});
于 2013-07-19T13:55:49.383 に答える
0

BirthDay ドロップダウンのみに検証を配置し (最後のドロップダウンであるため)、他の 2 つのフィールド変更イベントでこの検証をトリガーします。

$("#BirthYear, #BirthMonth").change(function(e){
    $("#BirthDay").valid();
});
于 2013-07-16T11:09:09.277 に答える