Int oder Number DataType für das Validierungsattribut DataAnnotation

111

In meinem MVC3-Projekt speichere ich Punktevorhersagen für Fußball / Fußball / Hockey / ... Sportspiel. Eine der Eigenschaften meiner Vorhersageklasse sieht also so aus:

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

Jetzt muss ich intin meinem Fall auch die Fehlermeldung für einen Datentyp ändern . Es wird eine Standardeinstellung verwendet: "Das Feld HomeTeamPrediction muss eine Zahl sein." Sie müssen einen Weg finden, wie Sie diese Fehlermeldung ändern können. Diese Validierungsnachricht scheint auch eine Vorhersage für die Remote-Validierung zu treffen.

Ich habe [DataType]Attribut ausprobiert , aber dies scheint keine einfache Zahl in der system.componentmodel.dataannotations.datatypeAufzählung zu sein.

Antonin Jelinek
quelle

Antworten:

221

Für jede Nummernvalidierung müssen Sie je nach Ihren Anforderungen unterschiedliche Bereichsvalidierungen verwenden:

Für Integer

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

für float

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

für doppelt

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]
Dilip0165
quelle
4
Das hat bei mir in meinem Kontext nicht funktioniert. Wenn der Benutzer "asdf" eingibt, löst [Range (typeof (decimal), "0", "9999.99", ErrorMessage = "Wert für {0} zwischen {1} und {2}") eine Ausnahme aus. Wenn ich jedoch [Range (typeof (decimal), "0.1", "9999.99", ErrorMessage = "Wert für {0} muss zwischen {1} und {2}") liegen, funktioniert die Fehlermeldung korrekt. 0 vs 0.1 macht keinen Sinn. Fehler vielleicht?
Meffect
1
Diese "Ganzzahl" -Validierung behandelt nicht ganzzahlige Werte als gültig (z. B. 0,3)
kevinpo
77

Versuchen Sie einen dieser regulären Ausdrücke:

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


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

hoffe es hilft: D.

Goran Žuri
quelle
13
Gibt es keinen einfacheren Weg? Ich würde auf etwas hoffen wie: [Numerisch (ErrorMessage = "Dieses Feld muss eine Zahl sein")]
Banford
3
Unglücklicherweise nicht. Sie können jederzeit Ihr eigenes Validierungsattribut schreiben.
Goran Žuri
2
Dies ist die bessere Lösung, da dies Zeichenfolgen abdeckt. int.MaxValuedeckt nur bis2.147.483.647
Christian Gollhardt
19

Verwenden Sie Regex in Datenanmerkungen

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }
Sathish
quelle
2
Dies scheint im Kontext der Frage gut zu funktionieren, vorausgesetzt, die Eigenschaft ist nicht int, sondern string.
Paul
1
Warum die Klammer um den regulären Ausdruck? Könnte es einfach sein [0-9]+?
Polkduran
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;
    }
}
stuartdotnet
quelle
5

Versuchen Sie dieses Attribut:

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

Außerdem müssen Sie das Attribut im Validator-Plugin registrieren:

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

Fast ein Jahrzehnt ist vergangen, aber das Problem gilt auch weiterhin für Asp.Net Core 2.2.

Ich habe es geschafft, indem ich data-val-numberdem Eingabefeld die Verwendungslokalisierung für die Nachricht hinzugefügt habe :

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

ASP.NET Core 3.1

Dies ist meine Implementierung der Funktion. Sie funktioniert sowohl auf der Serverseite als auch bei der JQuery-Validierung und ist wie jedes andere Attribut unauffällig mit einer benutzerdefinierten Fehlermeldung:

Das Attribut:

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

Clientseitige Logik:

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

Und schließlich die Verwendung:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
HMZ
quelle