自定义客户端非侵入式适配器验证方法,调用Ajax

时间:2019-03-11 14:26:35

标签: c# model-view-controller unobtrusive-validation

不确定我是否要采用正确的方法。

我试图在遵循某些业务规则的模型上对PersonalID字段进行验证。

业务规则方法将PersonalID作为字符串,并通过一些预定的检查并返回bool。

我创建了一个PersonalIdValidationAttribute,它继承了ValidationAttribute和IClientValidatable。 IsValid方法调用业务规则以确定PersonalID是否确实有效。

这一切似乎都按预期进行。如果我转向客户端验证,则POST上的模型验证将按预期进行。

GetClientValidationRules似乎也可以正常工作。这是代码:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule()
        {
            // Test Error Message
            ErrorMessage = "An Error",
            ValidationType = "personalidvalidation"
        };

        yield return rule;
    }

它也在创建带有data-val的输入字段,就像我期望的那样:

<input class="input valid" data-val="true" data-val-length="Rajoitus 30 merkkiä" data-val-length-max="11" data-val-personalidvalidation="An Error" data-val-required="Henkilötunnus on pakollinen" id="PolicyHolder_PersonalID" name="PolicyHolder.PersonalID" type="text" value="">

现在我不确定是否可以这样做。在脚本文件中,我要添加客户端验证:

$.validator.addMethod("personalidvalidation", function (value, element, params) {
        var record = { personalID: value };
        return $.ajax({
            url: "PersonalIdValidation",
            data: JSON.stringify(record),
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            success: function (response) {
                if (response.success) {
                    console.log('success');
                    return true;
                } else {
                    console.log('fail');
                    return false;
                }
            },
            error: function () {
                return false;
            }
        });
    });

    $.validator.unobtrusive.adapters.add("personalidvalidation", function (options) {
        options.rules["personalidvalidation"] = options.params;
        options.messages["personalidvalidation"] = options.message;
    });

查看开发者控制台中的“网络”选项卡,显示正在调用控制器方法,但从未正确显示验证消息。控制台中会显示成功和失败消息。

如何使用业务逻辑调用控制器以对PersonalID进行客户端验证?

谢谢。

0 个答案:

没有答案