web-dev-qa-db-ja.com

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

私の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フィールドは数字でなければなりません。」。このエラーメッセージを変更する方法を見つける必要があります。この検証メッセージは、リモート検証の予測にも使用されるようです。

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

97
Antonin Jelinek

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

整数の場合

[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")]
196
Dilip0165

正規表現を試す

[RegularExpression("([0-9]+)")]      // for 0-inf or 
[RegularExpression("([1-9][0-9]*)"] // for 1-inf

それが役立つことを願って:D

71
Goran Žuri

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

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

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

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;
        }
    );
}
6
Stefan Turcanu
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;
    }
}
3
stuartdotnet

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

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

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