C# 针对在ASP.NET核心MVC中不起作用的bool字段的不引人注目的客户端验证

C# 针对在ASP.NET核心MVC中不起作用的bool字段的不引人注目的客户端验证,c#,asp.net-core,asp.net-core-mvc,asp.net-core-mvc-2.0,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core Mvc 2.0,我在ASP.NET Core中发现了一个非常有趣的问题。我正在使用我的bool字段作为复选框。我想强制用户选中要提交表单的复选框 我的模型类中的布尔字段是: [Range(typeof(bool), "true", "true", ErrorMessage = "You must accept the Terms")] public bool TermsAccepted { get; set; } 请注意,我已经应用了[Range]验证属性。对于服务器端验证,它可以完美地工作 我的操作方法代码

我在ASP.NET Core中发现了一个非常有趣的问题。我正在使用我的bool字段作为复选框。我想强制用户选中要提交表单的复选框

我的模型类中的布尔字段是:

[Range(typeof(bool), "true", "true", ErrorMessage = "You must accept the Terms")]
public bool TermsAccepted { get; set; }
请注意,我已经应用了[Range]验证属性。对于服务器端验证,它可以完美地工作

我的操作方法代码相当简单:

[HttpPost]
public IActionResult Index(JobApplication jobApplication)
{
    if (ModelState.IsValid)
        return View("Accepted", jobApplication);
    else
        return View();
}
但当我应用客户端验证时,问题就出现了

在我看来,我应用了3个脚本:

@section scripts {
<script src="/lib/jquery/dist/jquery.min.js"></script>
<script src="/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js">
</script>
}
@节脚本{
}
客户端验证的工作原理完全相反,当我选中复选框时,它会给出错误消息。为什么会发生相反的事情

复选框生成的HTML代码为:

<input type="checkbox" class="input-validation-error" data-val="true" data-val-range="You must accept the Terms" data-val-range-max="True" data-val-range-min="True" data-val-required="The TermsAccepted field is required." id="TermsAccepted" name="TermsAccepted" value="true" aria-describedby="TermsAccepted-error">


请帮助?

我遇到了这个问题,您的代码可以添加一些内容

我更新到jquery.validate(1.19.1)和jquery.validation.unobtrusive(3.2.11)的最新版本(使用libman管理这些依赖项)

我还添加了这个javascript块来扩展该页面上验证程序方法的功能


//扩展范围验证器方法以区别对待复选框
var defaultRangeValidator=$.validator.methods.range;
$.validator.methods.range=函数(值、元素、参数){
如果(element.type==='checkbox'){
//如果是复选框,则选中后返回true
返回元素。已选中;
}否则{
//否则,运行默认的验证函数
返回defaultRangeValidator.call(this,value,element,param);
}
}

您的输入有
value=“true”
,(小写)但验证范围属性值是
“true”
(大写
T
),因此它与创建自定义
ValidationAttribute
时应该执行的操作不匹配(比如
[MustBeTrue]
)将规则添加到
$验证器中
@StephenMuecke我知道,但是在[Range]属性中,我给了它们“true”和“not”两个值,那么为什么会发生这种情况呢?此外,我不想创建自定义验证器,因为my range验证在服务器端正常工作,但在客户端则完全相反。我认为这是asp.net核心mvc中的一个错误。不确定。在
范围属性中使用
“true”
(即
字符串
)应生成
数据val range max=“true”
,但这仍然不能解决问题,因为输入值始终为
“true”
,因此需要编写脚本来覆盖复选框的范围规则