首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$.validator.unobtrusive.adapters.addBool()不工作

$.validator.unobtrusive.adapters.addBool()不工作
EN

Stack Overflow用户
提问于 2021-02-18 16:46:52
回答 1查看 203关注 0票数 0

在一个asp.net核心Razor应用程序中,使用,我试图获得一个自定义验证属性来工作客户端。这个表单由一个fetch()调用呈现到一个引导模式弹出,这可能与问题有关,尽管我在框架4.8AJAVC应用程序中遇到了同样的问题,在这个应用程序中,表单是通过asp.net调用呈现的。

在Razor Pages应用程序中,我按照通常的方式设置了服务器端属性:

代码语言:javascript
复制
public class TerminationReasonCodeAttribute : ValidationAttribute, IClientModelValidator
{
    private const string errorMessage = "When a Termination Reason is selected, a Termination Date must be entered, and vice-versa.";

    public void AddValidation(ClientModelValidationContext context)
    {
        MergeAttribute(context.Attributes, "data-val", "true");
        MergeAttribute(context.Attributes, "data-val-terminationreasoncode", errorMessage);
    }

    private bool MergeAttribute(
        IDictionary<string, string> attributes,
        string key,
        string value)
    {
        if (attributes.ContainsKey(key))
        {
            return false;
        }
        attributes.Add(key, value);
        return true;
    }
    ...rest of code omitted for brevity. 

该属性被添加到类的属性中,该类以通常的方式以表单形式呈现:

代码语言:javascript
复制
    [TerminationReasonCode]
    [StringLength(50)]
    [Display(Name = "Termination Reason")]
    public string TerminationReasonCode { get; set; } 

该表单是通过对服务器端方法的fetch()调用和设置div的innerHTML来呈现的,如下所示:

代码语言:javascript
复制
div.querySelector('div.modal-body').innerHTML = cleanHtml;

由于我正在呈现表单异步,所以我必须重新解析它:

代码语言:javascript
复制
    let $form = $(div).find('#editUserForm');
    $form.removeData('validator').removeData('unobtrusiveValidation');
    $.validator.unobtrusive.parse($form); 

然后我打电话给addMethod:

代码语言:javascript
复制
        $.validator.addMethod("terminationreasoncode", 
        function (value, element, param) {
            //the attribute is applied to TerminationReasonCode. this is arbitrary
            //it could have been applied to TerminationDate
            let terminationReason = value;
            let terminationDate = document.getElementById('TerminationDate').value;

            if (terminationReason && !terminationDate) {
                return false;
            }
            else if (terminationDate && !terminationReason) {
                return false;
            }
            else {
                return true;
            }
        });

最后,我称之为:

代码语言:javascript
复制
$.validator.unobtrusive.adapters.addBool("terminationreasoncode");

在我的表单中,当用户单击"save“按钮时,我调用$("#editUserForm").valid()。我的自定义验证方法从不触发,我也不知道原因。当我查看呈现的内容时,我可以看到所有的“数据.”标记被正确地呈现:

代码语言:javascript
复制
<select name="TerminationReasonCode" id="TerminationReasonCode" 
data-val-terminationreasoncode="When a Termination Reason is selected, a Termination Date must be 
entered, and vice-versa." 
data-val-length-max="50" 
data-val-length="The field Termination Reason must be a string with a maximum length of 50." 
data-val="true" 
class="form-control">

关键在于:如果我没有调用$.validator.unobtrusive.adapters.addBool("terminationreasoncode"),,而是执行下面看到的代码,它就能工作了!当我在javascript中调用$("#editUserForm").valid()时,将调用我的验证方法。为什么下面的代码可以工作,但是对addBool的调用却什么也不做?同样,在ajax调用呈现表单的asp.net mvc Framework4.8应用程序中,我遇到了完全相同的问题,而相同的解决方法也在那里工作。

代码语言:javascript
复制
        $('#TerminationReasonCode').rules('add',
        {
            terminationreasoncode: true,
            messages: { terminationreasoncode: "When a Termination Reason is selected, a Termination Date must be entered, and vice-versa." }
        });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-18 19:31:49

答案是这个呼吁:

代码语言:javascript
复制
$.validator.unobtrusive.parse($form);

必须在调用之后发生

代码语言:javascript
复制
$.validator.unobtrusive.adapters.addBool("terminationreasoncode");

除了调用addBool()之外,其他一切都正常工作,即使它在解析()之后运行。对addBool()的调用必须在要解析()的调用之前执行。如果有人知道为什么会这样,请发一个答案,我会选择它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66264343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档