Asp.net mvc 3 MVC3不引人注目的验证扩展;条款和条件复选框
关于这一点,我还看到了一些其他帖子: 但我已经实现了它们,无法完全理解为什么我的验证无法正常工作: 属性:Asp.net mvc 3 MVC3不引人注目的验证扩展;条款和条件复选框,asp.net-mvc-3,unobtrusive-validation,Asp.net Mvc 3,Unobtrusive Validation,关于这一点,我还看到了一些其他帖子: 但我已经实现了它们,无法完全理解为什么我的验证无法正常工作: 属性: [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class MustBeTrueAttribute : ValidationAttribute, IClientValidatabl
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class MustBeTrueAttribute : ValidationAttribute, IClientValidatable {
public override bool IsValid(object value) {
return value != null && (bool)value;
}
public override string FormatErrorMessage(string name) {
return string.Format("The {0} field must be true.", name);
}
#region Implementation of IClientValidatable
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
yield return new ModelClientValidationRule {
ErrorMessage = string.IsNullOrEmpty(ErrorMessage) ? FormatErrorMessage(metadata.DisplayName) : ErrorMessage,
ValidationType = "mustbetrue"
};
}
#endregion
}
模型属性:
[Display(Name = "I agree to RustyShark's Terms of Use")]
[MustBeTrueAttribute(ErrorMessage = "You must agree to the Terms of Use")]
public bool AgreeToTerms { get; set; }
视图:
@LabelFor(m=>m.AgreeToTerms)@ActionLink(“在此处查看”、“使用术语”、“主页”、空、新{target=“_blank”})。
@Html.CheckBoxFor(m=>m.AgreeToTerms)
@Html.ValidationMessageFor(m=>m.AgreeToTerms)
将呈现以下HTML:
<div class="formField">
<div class="label">
<label for="AgreeToTerms">I agree to RustyShark's Terms of Use</label>; <a href="/Home/TermsOfUse" target="_blank">view here</a>.
</div>
<div class="input">
<input data-val="true" data-val-mustbetrue="You must agree to the Terms of Use" data-val-required="The I agree to RustyShark&#39;s Terms of Use field is required." id="AgreeToTerms" name="AgreeToTerms" type="checkbox" value="true" class="valid"><input name="AgreeToTerms" type="hidden" value="false">
</div>
<span class="field-validation-valid" data-valmsg-for="AgreeToTerms" data-valmsg-replace="true"></span>
</div>
我同意RustyShark的使用条款。
服务器端验证正在工作(虽然它返回的是默认错误消息,而不是覆盖的错误消息),但是客户端没有,我只是没有收到任何消息,但是所有的事情都正确执行了?有人能看到我的问题吗?终于解决了 主要问题是我在$(document).ready()函数中执行$.validator方法。它需要作为一个内嵌函数执行!我刚把它们移到ready()外面,事情就开始发生了 此外,JS应如下所示:
$.validator.addMethod("mustbetrue", function (value, element, params) {
return value == true;
});
$.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
options.rules["required"] = true;
if (options.message) {
options.messages["required"] = options.message;
}
}
});
终于明白了 主要问题是我在$(document).ready()函数中执行$.validator方法。它需要作为一个内嵌函数执行!我刚把它们移到ready()外面,事情就开始发生了 此外,JS应如下所示:
$.validator.addMethod("mustbetrue", function (value, element, params) {
return value == true;
});
$.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
options.rules["required"] = true;
if (options.message) {
options.messages["required"] = options.message;
}
}
});
$.validator.addMethod("mustbetrue", function (value, element, params) {
return value == true;
});
$.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
options.rules["required"] = true;
if (options.message) {
options.messages["required"] = options.message;
}
}
});