Validation entier à l'égard des non-qualités requises en MVC
J'ai essayer de valider une propriété sur un modèle que j'ai. Cette propriété n'est PAS nécessaire, et donc si sa invalide MVC semble l'ignorer. J'ai même créé une coutume ValidationAttribute, mais rien ne fonctionne.
public class NumberWang : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null)
return true;
int g;
if (int.TryParse(value.ToString(), out g))
{
if (g >= 0)
return true;
}
return false;
}
}
public class MyModel
{
[Range(0, 999999, ErrorMessage = "category_id must be a valid number")]
[NumberWang(ErrorMessage = "That's NumberWang!")]
public int? category_id { get; set; }
/* there are other properties of course, but I've omitted them for simplicity */
public void Validate()
{
Validator.TryValidateProperty(this.category_id,
new ValidationContext(this, null, null) { MemberName = "category_id" },
this.validation_results);
}
}
Si je passe la valeur " abc " comme un category_id de ce modèle, il valide l'amende juste. Ce que je fais mal?
OriginalL'auteur roryok | 2013-08-20
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé un vilain solution de contournement.
Il semble que si category_id est nullable
int?
et ma valeur n'est pas un nombre valide, une valeur null est passé, et le modèle ne vois pas l'invalide valeur de "abc".Si je change category_id à un non nullable
int
, il échoue à la validation, même lorsque aucune valeur n'est transmise.Le Laid Solution De Contournement
Si je change category_id à un
string
, et seulement ensuite le convertir en unint
quand j'en ai besoin, je peux valider correctement, en utilisant seulement[Range]
C'est moche, mais ça fonctionne.
(Note: l'attribut personnalisé n'était pas nécessaire, donc je l'ai enlevé et juste utilisé [Plage])
OriginalL'auteur roryok
modèle:
vue:
OriginalL'auteur DrakonHaSh
Première votre modèle doit mettre en œuvre Ivalidatableobjet, mais le fait de Valider la méthode sera appelée que si la ModelState est valide. Ce lien peut aider.
Êtes-vous à la réception de votre modèle comme un paramètre dans l'action? Êtes-vous pour demander la ModelState.IsValid? Cela devrait fonctionner correctement avec le modèle de classeur par Défaut.
Validate()
au début de mon action, et il ne valider le autres propriétés. Si j'ai mis un[Required]
attribut sur category_id il validera comme manquant si pas inclus. Mais sans[Required]
, il semble tout simplement l'ignorer complètement!EDIT: en Fait, gratter que. Si j'ajoute
[Required]
et passer dans une chaîne, il semble ne pas voir la valeur. Je vais un peu travailler autour d'elle, je supposeOriginalL'auteur mgalindez
J'ai trouvé une solution de contournement que j'aime. Le problème que j'ai rencontré était un problème similaire, où la valeur devait être supérieure à 0 et un certain nombre, donc une fois que j'ai essayé de lancer le 9999999999 (invalides) chaîne de caractères comme un nombre, il a déclenché une exception et n'a pas montré que le modèle de l'état a un message d'erreur sur le post. J'espère que c'est sur le sujet, car il sonne comme "les Règles ne semblent pas s'appliquer correctement lorsque je tape dans un nombre non valide"
Depuis mon numéro a dû être positif, j'ai intercepté la valeur dans un type anonyme objet (dynamique) et l'a utilisé comme une interception de corps entre le modèle de l'utilisateur et le private int propriété. Quand je l'ai fait, les Annotations de Données a fonctionné comme prévu.
/J'ai pour convertir la valeur en Chaîne, car il vient en tant que Chaîne de caractères[], et si il n'y a plus d'une valeur, alors il devrait être problématique, de sorte que vous vous joignez avec un caractère non valide et renvoie une erreur, ou vous prenez la première valeur/
_myProperty = = Convert.ToInt32(Chaîne De Caractères.Join ("", valeur));
}
catch (Exception e)
{
_myProperty= -1;
}
}
}
OriginalL'auteur user3654055