Asp.net mvc ASP.NET MVC自定义验证程序客户端验证未启动

Asp.net mvc ASP.NET MVC自定义验证程序客户端验证未启动,asp.net-mvc,validation,unobtrusive-validation,asp.net-mvc-validation,Asp.net Mvc,Validation,Unobtrusive Validation,Asp.net Mvc Validation,我创建了一个自定义组验证程序,确保用户至少填写了给定组中的一个字段。当我加载页面并提交表单而无需输入任何内容时,此功能就可以工作 无效形式 有效形式 但是,问题是,只要表单存在组验证错误以外的任何错误。例如,当我强制表单显示group required validation错误,然后在组中的一个字段上显示字符串长度错误时,组验证错误不会消失 经过一段时间的调试后,我相当确定,无论何时生成客户端验证,都是客户端验证无法正常工作,因为没有删除服务器端验证错误。当表单生成字符串长度错误时,它会阻止表单

我创建了一个自定义组验证程序,确保用户至少填写了给定组中的一个字段。当我加载页面并提交表单而无需输入任何内容时,此功能就可以工作

无效形式 有效形式 但是,问题是,只要表单存在组验证错误以外的任何错误。例如,当我强制表单显示group required validation错误,然后在组中的一个字段上显示字符串长度错误时,组验证错误不会消失

经过一段时间的调试后,我相当确定,无论何时生成客户端验证,都是客户端验证无法正常工作,因为没有删除服务器端验证错误。当表单生成字符串长度错误时,它会阻止表单发布到服务器,这将删除组验证所需的错误

有人能看到客户端验证代码有问题吗?我从这个stackoverflow页面复制了代码,并对其进行了更改以满足我的需要。这是我第一次尝试自定义验证,如果问题非常简单,请原谅。另一个指标是,每当我输入并删除单个字符时,组验证错误不会打开/关闭

我在下面提供了自定义验证程序代码:

自定义验证程序C服务器端和客户端 剃须刀 我还认为问题可能在于它是如何触发的。因为validation属性不在文本输入本身上,而是在单选按钮上,所以我添加了下面的javascript,以便在单击按钮时对整个表单进行验证

<script>
    $(document).ready(function () {
        $(form).validate;
    });
</script>

我的自定义验证属性也有同样的问题。默认属性阻止将表单发布到服务器,而我的自定义属性被忽略。这就是我所做的

禁用客户端表单验证:

@{Html.EnableClientValidationfalse;}

在控制器中称为:

如果ModelState.IsValid { 返回视图模型;
}

服务器端代码有一半丢失。另外,通过更改javascript代码中的id,您的意思是您决定将有意义的名称atleastonerequired更改为不正确的名称requireateoneif?干得好!你需要把你的两分钱放进去吗?你的回答没有帮助。如果你知道这个洞的故事,这是有道理的。”requireAlleastoneif-单选按钮设置为true。所以在将来,把你聪明的评论留给自己。谢谢您的代码存在一些潜在问题。无论HaveDependents的值是多少,都将触发验证,我假设您只希望在名称RequiredLeastOn指示其为true时触发验证。如果没有,您实际在哪里检查该值。如果由于使用var val=$+property.val;而这是复杂对象的一部分,则下一次验证将失败;。但是,您显示的最后一个脚本只是在首次加载文档时验证表单,而不是在单击按钮时。是否发布了正确的代码?是的,我的目的是仅验证单选按钮是否正确,但我正在尝试让客户端组验证按原样工作。从那时起,我就意识到最后一段JavaScript是错误的。我已经在问题中添加了新的代码,但是这也不起作用。@CodeMonkey看看这个注释是如何开始的。您的单选按钮没有class='HaveDependents'so$'。HaveDependents'。有效;不执行任何操作,因为没有具有该类名的元素
jQuery.validator.unobtrusive.adapters.add(
    'requireatleaseoneif', ['properties'], function (options) {
        options.rules['requireatleaseoneif'] = options.params;
        options.messages['requireatleaseoneif'] = options.message;
    }
);

jQuery.validator.addMethod('requireatleaseoneif', function (value, element, params) {
    var properties = params.properties.split(',');
    var values = $.map(properties, function (property, index) {
        var val = $('#' + property).val();
        return val != '' ? val : null;
    });
    return values.length > 0;
}, '');
@Html.RadioButtonFor(m => m.HaveDependants, true, new { id = "borrower-haveDependants-true", @class = "block-radio-input" })
@Html.RadioButtonFor(m => m.HaveDependants, false, new { id = "borrower-haveDependants-false", @class = "block-radio-input" })             
@Html.ValidationMessageFor(m => m.HaveDependants)

@Html.LabelFor(m => m.DependantsAgeGroupOne)                            
@Html.TextBoxFor(m => m.DependantsAgeGroupOne, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.DependantsAgeGroupOne)

@Html.LabelFor(m => m.DependantsAgeGroupTwo)
@Html.TextBoxFor(m => m.DependantsAgeGroupTwo, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.DependantsAgeGroupTwo)

@Html.LabelFor(m => m.DependantsAgeGroupThree)
@Html.TextBoxFor(m => m.DependantsAgeGroupThree, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.DependantsAgeGroupThree)
<script>
    $(document).ready(function () {
        $(form).validate;
    });
</script>
$('input').blur(function () {
   $('.haveDependants').valid();
})