0

カスタムルール「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">
4

1 に答える 1

1

クライアント検証が (構成またはコードで) 有効になっていることを既に確認している場合は、目立たない検証スクリプトが html を解析し た後にアダプターを追加しているためだと思います。詳細と可能なオプションについては、こちらの回答を参照してください。

于 2014-07-20T11:40:44.763 に答える