【问题标题】:$.validator.unobtrusive.adapters.addBool() does not work$.validator.unobtrusive.adapters.addBool() 不起作用
【发布时间】:2021-05-21 15:55:57
【问题描述】:

在一个 asp.net 核心 Razor Pages 应用程序中,使用 jquery 不显眼的验证,我试图让自定义验证属性在客户端工作。表单正在通过 fetch() 调用到引导模式弹出窗口中呈现,这可能与问题有关,尽管我在呈现表单的框架 4.8 asp.net mvc 应用程序中遇到完全相同的问题通过 ajax 调用。

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

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. 

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

    [TerminationReasonCode]
    [StringLength(50)]
    [Display(Name = "Termination Reason")]
    public string TerminationReasonCode { get; set; } 

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

div.querySelector('div.modal-body').innerHTML = cleanHtml;

由于我正在异步渲染表单,我必须重新解析它:

    let $form = $(div).find('#editUserForm');
    $form.removeData('validator').removeData('unobtrusiveValidation');
    $.validator.unobtrusive.parse($form); 

然后我调用 addMethod:

        $.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;
            }
        });

最后,我称之为:

$.validator.unobtrusive.adapters.addBool("terminationreasoncode");

在我的表单中,当用户单击“保存”按钮时,我调用 $("#editUserForm").valid()。我的自定义验证方法永远不会触发,我不知道为什么。当我查看渲染的内容时,我可以看到我所有的“data-...”标签都正确渲染了:

<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 的调用却什么也没做?同样,我在 asp.net mvc Framework 4.8 应用程序中遇到了完全相同的问题,其中表单由 ajax 调用呈现,并且相同的解决方法在那里有效。

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

【问题讨论】:

    标签: c# unobtrusive-validation asp.net-core-razor-pages


    【解决方案1】:

    答案是这个调用:

    $.validator.unobtrusive.parse($form);
    

    必须发生在之后此调用:

    $.validator.unobtrusive.adapters.addBool("terminationreasoncode");
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多