这是这篇文章中一个较旧问题的扩展:
这让我对如何让客户端自定义验证与 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 文件中。
任何帮助,将不胜感激。
谢谢