0

他の 3 つのフィールドに依存するフィールドで複雑な検証を行っています。サーバーでの検証は、「検証」を使用する方法のため単純です。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
   // my validation
   if(complex_condition)
   {
       yield return new
               ValidationResult("my error", new List<string> {"field1"});
   }
}

しかし、クライアントで同じことを行う方法がわかりません。イベント「送信」に検証を入れることもできますが、必要なフィールド検証を起動したかのように、検証中のフィールドにエラーメッセージとして表示したいと思います。

ありがとうございました。

編集: 応答後の解決策 @DarinDimitrov:

Javascript:

$.validator.addMethod('mycustomvalidation', function (value, element, parameters) {

    if (value.length < 6) {
        return false;
    }

    return true;
});

$.validator.unobtrusive.adapters.add('mycustomvalidation', [], function (options) {
    options.rules['mycustomvalidation'] = {};

    for(var key in options.params) {
        options.rules['mycustomvalidation'][key] =  options.params[key];
    }

    options.messages['mycustomvalidation'] = options.message;
});

カスタム データ アノテーションを作成できます。

モデル:

[CustomClientValidation("mycustomvalidation", "value1", "value2", ErrorMessage="validacion propia")]
public string MyProperty { get; set; }

データ注釈:

public class CustomClientValidationAttribute : ValidationAttribute, IClientValidatable
{
    public CustomClientValidationAttribute(string validationType)
    {
        this.ValidationType = validationType;
    }

    public CustomClientValidationAttribute(string validationType, params object[] parameters)
        : this(validationType)
    {
        if (parameters != null && parameters.Count() > 0)
        {
            this.ValidationParameters = new Dictionary<string, object>();
            var countParameters = parameters.Count();
            for (var index = 0; index < countParameters; index++)
            {
                this.ValidationParameters.Add(string.Format("parameter{0}", index), parameters[index]);
            }
        }
    }

    public string ValidationType { get; set; }

    public IDictionary<string, object> ValidationParameters { get; set; }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule()
        {
            ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = this.ValidationType,
        };

        if (this.ValidationParameters != null)
        {
            foreach (var parameter in this.ValidationParameters)
            {
                rule.ValidationParameters.Add(parameter.Key, parameter.Value);
            }
        }

        yield return rule;
    }

    public override bool IsValid(object value)
    {
        return true;
    }
}

またはJavaScriptで:

$.validator.addMethod('mycustomvalidationii', function(value) {

    if (value.length < 6) {
        return false;
    }

    return true;
}, 'my custom validation');

$("#MyProperty").rules("add", "mycustomvalidationii");
4

1 に答える 1

0

IClientValidatableインターフェイスを実装するカスタム検証属性を作成し、クライアント検証用のカスタム アダプターを登録できます。次のは、複数の依存プロパティを検証できるカスタム検証属性を記述し、カスタム クライアント検証アダプターをアタッチしてクライアントで同じ検証ロジックを複製する方法を示しています。

于 2012-05-03T07:20:15.283 に答える