Удаленная проверка с помощью kendo, validator.validate () всегда возвращается как истина - PullRequest
0 голосов
/ 23 марта 2020

Я срываю волосы с этой проблемой. Я настроил удаленную проверку для использования в форме с входами кендо. Но когда я пытаюсь отправить форму, когда удаленная проверка не удалась, это не помешает пользователю отправить, потому что validator.validate () возвращает true независимо от того, прошла ли удаленная проверка самостоятельно или не прошла.

Вот мой HTML

<form class="on-page-form" method="post">

@* Inputs *@
<div class="row">
    <div class="col-sm-3">
        <div class="input-outer">
            <label asp-for="@Model.SystemRole.SystemRoleDesc" class="required"></label>
            <input asp-for="@Model.SystemRole.SystemRoleDesc" data-val-remote-url="@Url.PageLink("Create", "CheckSystemRoleDescExists")" class="k-textbox" />
            <span asp-validation-for="@Model.SystemRole.SystemRoleDesc" ></span>
        </div>

        <div class="input-outer">
            <label asp-for="@Model.SystemRole.SystemRoleRef" class="required"></label>
            <input asp-for="@Model.SystemRole.SystemRoleRef" data-val-remote-url="@Url.PageLink("Create", "CheckSystemRoleRefExists")" class="k-textbox" />
            <span asp-validation-for="@Model.SystemRole.SystemRoleRef" ></span>
        </div>

    </div>
    <div class="col-sm-3"></div>
    <div class="col-sm-3"></div>
    <div class="col-sm-3"></div>
</div>

<hr />
@* Buttons *@
<input type="submit" value="Create" class="btn btn-primary" />

Вот мой Javascript

function forgeryToken() {
        return kendo.antiForgeryTokens();
    }

    (function ($, kendo) {
        $.extend(true, kendo.ui.validator, {
            rules: {
                remote: function (input) {
                    if (input.val() == "" || !input.attr("data-val-remote-url")) {
                        return true;
                    }

                    if (input.attr("data-val-remote-recieved")) {
                        input.attr("data-val-remote-recieved", "");
                        return !(input.attr("data-val-remote"));
                    }

                    var url = input.attr("data-val-remote-url");
                    var validator = this;
                    var currentInput = input;
                    input.attr("data-val-remote-requested", true);

                    const data = {};

                    data[input.attr("name")] = input.val();

                    let valid = true;

                    $.ajax({
                        url: url,
                        type: "POST",
                        data: data,
                        dataType: "json",
                        headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
                        success: function (data) {

                            console.log(data);

                            if (data == true) input.attr("data-val-remote", "");
                            else input.attr("data-val-remote", data);

                            input.attr("data-val-remote-recieved", true);

                            validator.validateInput(currentInput);

                            return data == true ? true : false;
                        },
                        error: function (data) {
                            input.attr("data-val-remote-recieved", true);
                            validator.validateInput(currentInput);
                        }
                    });

                    return true;
                }
            },
            messages: {
                remote: function (input) {
                    return input.attr("data-val-remote");
                }
            }
        });
    })(jQuery, kendo);

    $(document).ready(function () {
        var validator = $("form").kendoValidator().data("kendoValidator");

        $("form").submit(function (event) {

            if (!validator.validate()) event.preventDefault();

        });
    })

Вот мои 2 c# функции, которые проверяют действующие значения по БД

        public JsonResult OnPostCheckSystemRoleDescExists()
        {
            var exists = !_context.SystemRole.Any(a => a.SystemRoleDesc == SystemRole.SystemRoleDesc);

            if (!exists) return new JsonResult("Role description already exists");

            return new JsonResult(exists);
        }

        public JsonResult OnPostCheckSystemRoleRefExists()
        {
            var exists = !_context.SystemRole.Any(a => a.SystemRoleRef == SystemRole.SystemRoleRef);

            if (!exists) return new JsonResult("Role reference already exists");

            return new JsonResult(exists);
        }

Вот моя модель

        [Display(Name = "System Role Description")]
        [PageRemote(HttpMethod = "post", AdditionalFields = "__RequestVerificationToken", PageHandler = "CheckSystemRoleDescExists", ErrorMessage = "System Role Description already exists")]
        [Required]
        public string SystemRoleDesc { get; set; }
        [Display(Name = "System Role Reference")]
        [Required]
        [PageRemote(HttpMethod = "post", AdditionalFields = "__RequestVerificationToken", PageHandler = "CheckSystemRoleRefExists", ErrorMessage = "System Role Reference already exists")]
        public string SystemRoleRef { get; set; }

Я использую asp. net core 3.1. Все остальные проверки на стороне клиента (например, требуемые) работают отлично, но этот маленький багер действительно ставит под сомнение мою карьеру в данный момент (не буквально).

...