Int ou Number DataType pour l'attribut de validation DataAnnotation


111

Sur mon projet MVC3, je stocke la prédiction de score pour le football / soccer / hockey / ... jeu de sport. Donc, l'une des propriétés de ma classe de prédiction ressemble à ceci:

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

Maintenant, je dois également modifier le message d'erreur pour un type de données, intdans mon cas. Une valeur par défaut est utilisée - "Le champ HomeTeamPrediction doit être un nombre.". Besoin de trouver un moyen de modifier ce message d'erreur. Ce message de validation semble également prendre la prédiction pour une validation à distance.

J'ai essayé l' [DataType]attribut mais cela ne semble pas être un nombre simple dans l' system.componentmodel.dataannotations.datatypeénumération.

Réponses:


221

Pour toute validation de numéro, vous devez utiliser une validation de plage différente selon vos besoins:

Pour un entier

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

pour flotteur

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

pour double

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

4
Cela n'a pas fonctionné pour moi dans mon contexte. Si l'utilisateur entre "asdf", [Range (typeof (decimal), "0", "9999.99", ErrorMessage = "La valeur de {0} doit être comprise entre {1} et {2}")] lève une exception. Cependant, si je fais [Range (typeof (decimal), "0.1", "9999.99", ErrorMessage = "La valeur pour {0} doit être comprise entre {1} et {2}")], le message d'erreur fonctionnera correctement. 0 contre 0,1, n'a aucun sens. bug peut-être?
meffect le

1
Cette validation "entière" traite les valeurs non entières comme valides (par exemple 0,3)
kevinpo

77

Essayez l'une de ces expressions régulières:

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


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

j'espère que cela aide: D


13
N'y a-t-il pas un moyen plus simple? J'espère quelque chose comme: [Numeric (ErrorMessage = "Ce champ doit être un nombre")]
Banford

3
Malheureusement non. Vous pouvez toujours écrire votre propre attribut de validation.
Goran Žuri

2
C'est la meilleure solution, car elle couvre les chaînes. int.MaxValuene couvre que jusqu'au2.147.483.647
Christian Gollhardt

19

Utiliser l'expression régulière dans l'annotation de données

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

2
Cela semble fonctionner correctement dans le contexte de la question, à condition que la propriété ne soit pas un int, mais une chaîne.
Paul

1
Pourquoi la parenthèse autour de l'expression régulière? Serait-ce juste [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;
    }
}

5

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

Et vous devez également enregistrer l'attribut dans le plugin de validation:

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

0

près d'une décennie s'est écoulée, mais le problème est toujours d'actualité avec Asp.Net Core 2.2.

Je l'ai géré en ajoutant data-val-numberau champ de saisie la localisation d'utilisation sur le message:

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

0

ASP.NET Core 3.1

Ceci est ma mise en œuvre de la fonctionnalité, cela fonctionne côté serveur ainsi qu'avec la validation jquery discrète avec un message d'erreur personnalisé comme tout autre attribut:

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

Logique côté client:

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

Et enfin l' utilisation:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.