【发布时间】:2013-09-06 16:42:33
【问题描述】:
我正在尝试让自定义规则“必须为真”正常工作。大致基于this question: 我的问题是,当我提交表单时,客户端验证不会给我一个错误(不会显示验证文本)。 此外,我在 jscript 验证方法中设置了一个断点,它永远不会被触发。添加适配器的连线代码确实被触发。控制台中没有错误。
我做错了什么?
这就是我的服务器端:
public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if (value == null) return false;
try
{
return Convert.ToBoolean(value);
}
catch (InvalidCastException)
{
return false;
}
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "mustbetrue"
};
}
}
和
public class MustBeTrueAttributeAdapter : DataAnnotationsModelValidator<MustBeTrueAttribute>
{
public MustBeTrueAttributeAdapter(ModelMetadata metadata, ControllerContext context, MustBeTrueAttribute attribute)
: base(metadata, context, attribute)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
return new[] { new ModelClientValidationMustBeTrueRule(ErrorMessage) };
}
}
public class ModelClientValidationMustBeTrueRule : ModelClientValidationRule
{
public ModelClientValidationMustBeTrueRule(string errorMessage)
{
ErrorMessage = errorMessage;
ValidationType = "mustbetrue";
}
}
在 global.asax 中
protected void Application_Start()
{
// stuff
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MustBeTrueAttribute), typeof(MustBeTrueAttributeAdapter));
// stuff
}
在对象上:
[MustBeTrue(ErrorMessageResourceName = "Register_TermsNotAccepted", ErrorMessageResourceType = typeof(Resources.Global))]
public bool AcceptedTerms { get; set; }
客户端:
$(document).ready(function () {
jQuery.validator.addMethod("mustbetrue", function (value, element) {
if (!this.depend(param, element))
return "dependency-mismatch";
return element.checked;
});
jQuery.validator.unobtrusive.adapters.addBool("mustbetrue", "mustbetrue");
});
以及输出的相关 HTML:
<input data-val="true" data-val-mustbetrue="You must accept the terms and conditions" data-val-required="The AcceptedTerms field is required." id="AcceptedTerms" name="AcceptedTerms" type="checkbox" value="true" class="valid">
【问题讨论】:
-
不要偏离总体目标,但
Required在复选框上还不够吗?未选中的复选框不会通过网络发送,是吗(因此强制执行Required)? -
是的,我听说人们说它无需添加新规则即可工作。但是在实践中,我从来没有让它工作过。即使在 1 或 4 处添加了 min max 的组合。
-
@Brad 由于非空布尔值总是有一个值,要么是 False 要么是 True,所以它总是满足 Required 属性。这里需要的不是Required 属性,而是确保它匹配某个值的验证。 required 只是检查一个值是否存在,但不关心该值是 0、1、true、false 等。
标签: jquery asp.net-mvc unobtrusive-validation