DataAnnotation検証属性のIntまたはNumber DataType


111

私のMVC3プロジェクトでは、サッカー/サッカー/ホッケー/ ...スポーツゲームのスコア予測を保存します。したがって、私の予測クラスのプロパティの1つは次のようになります。

[Range(0, 15, ErrorMessage = "Can only be between 0 .. 15")]
[StringLength(2, ErrorMessage = "Max 2 digits")]
[Remote("PredictionOK", "Predict", ErrorMessage = "Prediction can only be a number in range 0 .. 15")]
public int? HomeTeamPrediction { get; set; }

ここで、データ型のエラーメッセージも変更する必要がありますint。いくつかのデフォルトが使用されています-「フィールドHomeTeamPredictionは数値でなければなりません。」このエラーメッセージを変更する方法を見つける必要があります。この検証メッセージは、リモート検証1の予測も取るようです。

私は[DataType]属性を試しましたが、これはsystem.componentmodel.dataannotations.datatype列挙では明白な数ではないようです。

回答:


221

数値検証では、要件に応じて異なる範囲検証を使用する必要があります。

整数の場合

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

フロート用

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

ダブル用

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]

4
これは私のコンテキストでは機能しませんでした。ユーザーが「asdf」を入力した場合、[Range(typeof(decimal)、 "0"、 "9999.99"、ErrorMessage = "Value for {0} to be between {1} and {2}")]が例外をスローします。ただし、[Range(typeof(decimal)、 "0.1"、 "9999.99"、ErrorMessage = "Value for {0} to be between {1} and {2}")]を実行すると、エラーメッセージは正しく機能します。0 vs 0.1は意味がありません。たぶんバグ?
meffect 2014

1
この有効として「整数」の検証扱い非整数値(例えば0.3)
kevinpo

77

次の正規表現のいずれかを試してください。

// for numbers that need to start with a zero
[RegularExpression("([0-9]+)")] 


// for numbers that begin from 1
[RegularExpression("([1-9][0-9]*)")] 

それが役に立てば幸い:D


13
より簡単な方法はありませんか?[数値(にErrorMessage =「このフィールドは番号でなければなりません」)]:私のような何かを望んでいるだろう
Banford

3
残念だけど違う。いつでも独自の検証属性を作成できます。
GoranŽuri

2
これは文字列をカバーするので、これはより良い解決策です。int.MaxValueまでのみカバー2.147.483.647
クリスチャンゴルハート、2015

19

データ注釈で正規表現を使用する

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }

2
プロパティがintではなくstringである場合、これは質問のコンテキストでは問題なく機能するようです。
ポール

1
なぜ正規表現を括弧で囲んでいるのですか?それだけで[0-9]+いいの?
polkduran 2018年

5
public class IsNumericAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            decimal val;
            var isNumeric = decimal.TryParse(value.ToString(), out val);

            if (!isNumeric)
            {                   
                return new ValidationResult("Must be numeric");                    
            }
        }

        return ValidationResult.Success;
    }
}

5

この属性を試してください:

public class NumericAttribute : ValidationAttribute, IClientValidatable {

    public override bool IsValid(object value) {
        return value.ToString().All(c => (c >= '0' && c <= '9') || c == '-' || c == ' ');
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "numeric"
        };
        yield return rule;
    }
}

また、バリデータプラグインに属性を登録する必要があります。

if($.validator){
     $.validator.unobtrusive.adapters.add(
        'numeric', [], function (options) {
            options.rules['numeric'] = options.params;
            options.messages['numeric'] = options.message;
        }
    );
}

0

ほぼ10年が経過しましたが、この問題はAsp.Net Core 2.2でも同様に有効です。

data-val-number入力フィールドにメッセージのローカライズを追加して管理しました。

<input asp-for="Age" data-val-number="@_localize["Please enter a valid number."]"/>

0

ASP.NET Core 3.1

これは私の機能の実装であり、他の属性と同じようにカスタムエラーメッセージを表示せずにサーバー側だけでなくjquery検証でも機能します。

属性:

  [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class MustBeIntegerAttribute : ValidationAttribute, IClientModelValidator
    {
        public void AddValidation(ClientModelValidationContext context)
        {
            MergeAttribute(context.Attributes, "data-val", "true");
            var errorMsg = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
            MergeAttribute(context.Attributes, "data-val-mustbeinteger", errorMsg);
        }

        public override bool IsValid(object value)
        {
            return int.TryParse(value?.ToString() ?? "", out int newVal);
        }

        private bool MergeAttribute(
              IDictionary<string, string> attributes,
              string key,
              string value)
        {
            if (attributes.ContainsKey(key))
            {
                return false;
            }
            attributes.Add(key, value);
            return true;
        }
    }

クライアント側のロジック:

$.validator.addMethod("mustbeinteger",
    function (value, element, parameters) {
        return !isNaN(parseInt(value)) && isFinite(value);
    });

$.validator.unobtrusive.adapters.add("mustbeinteger", [], function (options) {
    options.rules.mustbeinteger = {};
    options.messages["mustbeinteger"] = options.message;
});

そして最後に使用法:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.