1

这是这篇文章中一个较旧问题的扩展:

使用数据注释强制模型的布尔值为真

这让我对如何让客户端自定义验证与 jquery-unubtrusive-ajax.js 一起工作有了很多见解。

这是答案代码:

            namespace Checked.Entitites
            {
                public class BooleanRequiredAttribute : ValidationAttribute, IClientValidatable
                {
                    public override bool IsValid(object value)
                    {
                        return value != null && (bool)value == true;
                    }

                    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
                    {
                        //return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "booleanrequired", ErrorMessage = this.ErrorMessage } };
                        yield return new ModelClientValidationRule() 
                        { 
                            ValidationType = "booleanrequired", 
                            ErrorMessage = this.ErrorMessageString 
                        };
                    }
                }
            }
  • 当我在我的模型中使用这个自定义属性时,它工作正常。前任:

            [BooleanRequired(ErrorMessage = "Please accept the terms")]
            public bool Terms { get; set; }
    
  • 当我在视图中使用 textboxfor 时,错误消息会填充到 html 验证摘要中。

            @Html.CheckBoxFor(model => model.Terms, new { @class = "legalbox",  @placeholder = "Terms" })
    
  • 我还必须将此行添加到我的 jquery.unubtrusive-ajax.js

            $.validator.unobtrusive.adapters.addBool("BooleanRequired", "required"); 
    

当我在控制器中引用此模型并检查模型状态时,会出现此修复的问题。无论我有什么作为此自定义验证字段的值,modelstate 始终为 false。看起来覆盖 isvalid 在客户端验证中有效,但在服务器端无效。我需要它同时在两者上工作,并且一直在寻找一个不是“抛弃数据注释并使用其他东西”的解决方案。

我在控制器中使用的特定行永远不会与此字段一起传递如下:

            if (ModelState.IsValid) {
                 //Logic here
            }

使用标准数据注释的模型的其余部分可以正确验证,我只是无法让这个自定义的模型以与内置属性相同的方式工作。正确的解决方案可能会阻止我将该行添加到不显眼的 ajax 文件中。

任何帮助,将不胜感激。

谢谢

4

0 回答 0