1

カスタム属性を作成しましたが、クライアント側では機能しないようです。ModelState.IsValid()メソッドを呼び出すと、サーバー上でのみ機能します。オンラインのどこかで、アプリケーションのstartメソッドにカスタム属性を登録する必要があることを読みましたが、明確ではありませんでした。助けてください。

public class MaximumAmountAttribute : ValidationAttribute
    {
    private static string defErrorMessage = "Amount available '$ {0:C}' can not be more than loan amount '$ {1:C}'";
    private string MaximumAmountProperty { get; set; }
    double minimumValue = 0;
    double maximumValue = 0;

    public MaximumAmountAttribute(string maxAmount)
        : base(defErrorMessage)
    {
        if (string.IsNullOrEmpty(maxAmount))
            throw new ArgumentNullException("maxAmount");

        MaximumAmountProperty = maxAmount;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            PropertyInfo otherPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(MaximumAmountProperty);

            if (otherPropertyInfo == null)
            {
                return new ValidationResult(string.Format("Property '{0}' is undefined.", MaximumAmountProperty));
            }

            var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);

            if (otherPropertyValue != null && !string.IsNullOrEmpty(otherPropertyValue.ToString()))
            {
                minimumValue = Convert.ToDouble(value);
                maximumValue = Convert.ToDouble(otherPropertyValue);

                if (minimumValue > Convert.ToDouble(otherPropertyValue.ToString()))
                {
                    return new ValidationResult(string.Format(defErrorMessage, minimumValue, maximumValue));
                }
            }
        }

        return ValidationResult.Success;
    }
}
4

1 に答える 1

2

カスタム検証属性を使用してサーバー側の検証を作成しても、検証ルールはクライアントブラウザーに「転送」されません(カスタムjavascript検証関数がレンダリングされます)。
検証ロジックもクライアントスクリプトとして作成する必要があります。あなたがしなければならないことがいくつかあります:

  1. クライアントで検証する必要のある要素(入力)が次のようになっていることを確認してください。

    <input data-val-MaximumAmount="Validation error massage" />

    エラーメッセージを保持するdata-val-XXX属性が必要です。Html.TextBoxFor同じことをしています(レンダリングされたhtml要素にそのような属性を追加します)。

  2. この方法でクライアント側の検証を作成して登録する必要があります。

    (function ($) {
        // Creating the validation method
        $.validator.addMethod('MaximumAmount', function (value, element, param) {
            if (...) // some rule. HERE THE VALIDATION LOGIC MUST BE IMPLEMENTED!
                return false;
            else
                return true;
        });
    
        // Registering the adapter
        $.validator.unobtrusive.adapters.add('MaximumAmount', function (options) {
            var element = options.element,
                message = options.message;
    
            options.rules['MaximumAmount'] = $(element).attr('data-val-MaximumAmount');
            if (options.message) {
                options.messages['MaximumAmount'] = options.message;
            }
        });
    
    })(jQuery);
    
    // Binding elements to validators
    $(function () {
        $(':input[data-val-MaximumAmount]').each(function () {
            $.validator.unobtrusive.parseElement(this, true);
        });
    });
    
于 2013-03-27T12:13:54.693 に答える