I'm trying to get a custom rule "mustbetrue" working. Based loosely on this question: My issue is that when I submit the form the client side validation doesn't give me an error (doesn't make the validation text appear). In addition I've put a break point in the jscript validation method and it never gets fired. The wireup code that adds the adapter does get fired. No errors in the console.
我正在尝试使用自定义规则“mustbetrue”。松散地基于这个问题:我的问题是,当我提交表单时,客户端验证不会给我一个错误(不会使验证文本出现)。另外我在jscript验证方法中设置了一个断点,它永远不会被触发。添加适配器的连线代码会被触发。控制台中没有错误。
What am I doing wrong?
我究竟做错了什么?
This is what I have server-side:
这就是我的服务器端:
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"
};
}
}
and
和
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";
}
}
and in the global.asax
并在global.asax中
protected void Application_Start()
{
// stuff
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MustBeTrueAttribute), typeof(MustBeTrueAttributeAdapter));
// stuff
}
and on the object:
并在对象上:
[MustBeTrue(ErrorMessageResourceName = "Register_TermsNotAccepted", ErrorMessageResourceType = typeof(Resources.Global))]
public bool AcceptedTerms { get; set; }
client side:
客户端:
$(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");
});
and the relevant HTML that is output:
以及输出的相关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">
1 个解决方案
#1
1
If you've already checked that client validation is enabled (either in configuration or in code) then I guess it is because you're adding your adapter after unobtrusive validation scripts parses html see my answer here for details and possible options
如果您已经检查过启用了客户端验证(在配置或代码中),那么我想这是因为您在不显眼的验证脚本解析html之后添加了适配器,请参阅此处的答案以获取详细信息和可能的选项
#1
1
If you've already checked that client validation is enabled (either in configuration or in code) then I guess it is because you're adding your adapter after unobtrusive validation scripts parses html see my answer here for details and possible options
如果您已经检查过启用了客户端验证(在配置或代码中),那么我想这是因为您在不显眼的验证脚本解析html之后添加了适配器,请参阅此处的答案以获取详细信息和可能的选项