MVCとデータアノテーションを使用してクライアント側に0より大きいバリデーターを追加する最良の方法は何ですか?


92

特定のフィールドの値が0より大きい場合にのみフォームの送信を許可できるようにしたいのですが、Mvc範囲属性では1つだけの値を入力して、より大のテストのみを示すことができると思いましたが、最小値と最大値を主張しているので、運はありません。

これをどのように達成できるかについてのアイデアはありますか?

回答:


241

基になるデータ型が保持できる数よりも大きな数を格納することはできないため、Range属性に最大値が必要であるという事実は非常に良いことです。これは実世界には存在しないので、次のように機能することを覚えておいてください。

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }

このアプローチの欠点は、「abcd」を検証すると次のように表示されることですPlease enter a value less than or equal to 2147483647
Mike Cole

数値フィールドに文字を入力することはできません。これに伴う問題は、9999999999999999999と入力すると、番号が小さすぎるということです。
ジョン卿

12

この回答は、float / doubleの正の値を検証するためのものです。これらの型には「イプシロン」に役立つ定数があることがわかります

ゼロより大きい正の最小のSystem.Double値を表します。

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }

イプシロンは実際には微積分関数です。これは、基本的に「ゼロと区別できる最小の数」と言う「制限」関数なので、最終的には.00000001のエントリになる可能性があります。私は分に現実的な数を置くでしょう。
John Lord

9

次のように独自のバリデーターを作成できます。

    public class RequiredGreaterThanZero : ValidationAttribute
{
    /// <summary>
    /// Designed for dropdowns to ensure that a selection is valid and not the dummy "SELECT" entry
    /// </summary>
    /// <param name="value">The integer value of the selection</param>
    /// <returns>True if value is greater than zero</returns>
    public override bool IsValid(object value)
    {
        // return true if value is a non-null number > 0, otherwise return false
        int i;
        return value != null && int.TryParse(value.ToString(), out i) && i > 0;
    }
}

次に、そのファイルをモデルに含め、次のように属性として使用します。

    [RequiredGreaterThanZero]
    [DisplayName("Driver")]
    public int DriverID { get; set; }

私は通常、これをドロップダウン検証で使用します。validationattributeを拡張しているため、パラメーターを使用してエラーメッセージをカスタマイズできます。


1
私は、カスタムバリデーターを必要とする別の状況でこの回答を使用することになりました。検証がゼロより大きい単純な整数の場合、Darinの答えを使用する必要があります。
ザック

私は実際には彼の方法も好んでいますが、私と一緒に働く人々は値の「任意に制限を設定する」という問題を抱えています。
John Lord、

ハ、それは奇妙に思えます。有効な範囲が最大整数サイズよりも小さい場合、彼らの推論を見ることができました。
ザック

それは小数点以下の問題です。見もせず、私はかなり確信して1が分かで構築された最大の機能を持っていないことだ。
ジョン卿

これは私にとって最高の解決策でした!
デイブスチュアート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.