asp.net mvcの最小値/最大値バリデーター


106

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; }

これを書くための定義済みの属性はありますか?またはどうすればこれを達成できますか?


FluentValidationは、日付範囲を解決するための別のソリューションになる可能性があります。ここに役立つかもしれない別の質問への私の答えです。
ジノフ2016

回答:


48

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属性はかなり同じでなければなりません


OK、それらが存在することを期待していましたが、それらを書くのに十分公平です。どうも!
stiank81 2011

1
ちなみに、これはJavaScript側のフォームを魔法のように検証するものではありません。そのためには、追加のコード+ jsを記述する必要があります。
バサラト2013年

3
@basarat実際には追加のJSは必要ありません。jquery検証ライブラリにはすでに最小/最大の関数がありIClientValidationます。上記の属性にインターフェイスを実装し、GetClientValidationRulesメソッドから正しい値を返すだけです
WickyNilliams

@WickyNilliamsは、コメントの例を含む回答を追加しますか、またはCharlesOuelletは、Wickyのコメントの例を使用してこの回答を編集しますか?クライアント側の検証を含む実際の例に賛成したいです。
Karr、

@JohnieKarr .NETを使用しなくなったので、答えの多くを提供できません。とは言っても、以下のこの回答は、私が説明した内容を正確に示しているようです
WickyNilliams '25年

195

min / max validations属性が存在しないと思います。私は次のようなものを使用します

[Range(1, Int32.MaxValue)]

最小値1および

[Range(Int32.MinValue, 10)]

最大値10


4
うーん。これはあまり快適ではありません。私には少しハックに見えます。
stiank81 2011

21
それは少しハッキーです。しかし、ハックによって私はより快適に感じることがあります:)
Guy

4
このアプローチは、デフォルトのエラーメッセージを上書きするか、「プロパティxが-2e ^ 31-1と10の間でなければならない」のような恐ろしいものを取得する限り、問題ありません。
ナインテール

2
このハックで不快なのはどうですか?私には素晴らしいアプローチのようです。

1
RangeAttributeAllowMultiple = falseあるので、これはコンパイルできません。
ダニエルシリング

38

これを行う方法の完全な例。クライアント側の検証スクリプトを記述しなくても済むように、既存の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;
    }

}

8
すばらしい答えです。エラーメッセージを少し変更します。「以上の値を入力してください」は、より正確な(文法的に言えば)正しいエラーメッセージです。
Tieson T. 2012

0

jQuery Validation Pluginはすでにminおよびmaxルールを実装しています。カスタム属性のアダプターを作成するだけです。

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;
   });

最小属性は非常に似ています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.