他の 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");