Asp.net mvcの属性を使用した検証は本当に素晴らしいです。これまでに、値のチェックに[Range(min, max)]
バリデーターを使用してきました。例:
[Range(1, 10)]
public int SomeNumber { get; set; }
ただし、最小と最大の状態を個別に確認する必要があります。私はこれらのような属性を見つけることを期待していました:
[MinValue(1, "Value must be at least 1")]
[MaxValue(10, "Value can't be more than 10")]
public int SomeNumber { get; set; }
これを記述するための定義済みの属性はありますか?または、どうすればこれを達成できますか?
MaxValueのバリデーターを作成する方法を次に示します
public class MaxValueAttribute : ValidationAttribute
{
private readonly int _maxValue;
public MaxValueAttribute(int maxValue)
{
_maxValue = maxValue;
}
public override bool IsValid(object value)
{
return (int) value <= _maxValue;
}
}
MinValue属性はほぼ同じである必要があります
最小/最大検証属性が存在するとは思わない。私は次のようなものを使用します
[Range(1, Int32.MaxValue)]
最小値1および
[Range(Int32.MinValue, 10)]
最大値10
これを行う方法の完全な例。クライアント側の検証スクリプトを記述する必要を避けるため、既存のValidationType = "range"が使用されています。
public class MinValueAttribute : ValidationAttribute, IClientValidatable
{
private readonly double _minValue;
public MinValueAttribute(double minValue)
{
_minValue = minValue;
ErrorMessage = "Enter a value greater than or equal to " + _minValue;
}
public MinValueAttribute(int minValue)
{
_minValue = minValue;
ErrorMessage = "Enter a value greater than or equal to " + _minValue;
}
public override bool IsValid(object value)
{
return Convert.ToDouble(value) >= _minValue;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = ErrorMessage;
rule.ValidationParameters.Add("min", _minValue);
rule.ValidationParameters.Add("max", Double.MaxValue);
rule.ValidationType = "range";
yield return rule;
}
}
jQuery Validationプラグインはすでに最小および最大ルールを実装しています。カスタム属性のアダプターを作成するだけです。
public class MaxAttribute : ValidationAttribute, IClientValidatable
{
private readonly int maxValue;
public MaxAttribute(int maxValue)
{
this.maxValue = maxValue;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = ErrorMessageString, maxValue;
rule.ValidationType = "max";
rule.ValidationParameters.Add("max", maxValue);
yield return rule;
}
public override bool IsValid(object value)
{
return (int)value <= maxValue;
}
}
アダプタ:
$.validator.unobtrusive.adapters.add(
'max',
['max'],
function (options) {
options.rules['max'] = parseInt(options.params['max'], 10);
options.messages['max'] = options.message;
});
最小属性は非常に似ています。