カスタムルール「mustbetrue」を機能させようとしています。この質問に大まかに基づいています:私の問題は、フォームを送信すると、クライアント側の検証でエラーが発生しない(検証テキストが表示されない)ことです。さらに、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">