web-dev-qa-db-fra.com

Comment fonctionnent les annotations de données?

J'utilise des annotations de données dans mon projet ASP.NET MVC 3 pour valider le modèle. Celles-ci sont extrêmement pratiques mais actuellement, elles sont magiques pour moi. J'ai lu que les annotations de données font pas lèvent des exceptions. Comment alors MVC sait-il comment ajouter des erreurs de validation au dictionnaire d'état du modèle? Comment l'échec de la définition d'une propriété sur le modèle à cause de la validation du modèle remonte-t-il jusqu'à MVC si aucune exception n'est levée? J'ai toujours supposé que des exceptions étaient levées à chaque fois qu'une propriété échouait et que la liaison de modèle MVC a intercepté l'exception et l'a ajoutée au dictionnaire d'état du modèle.

Pour tester cela, j'ai créé une application console et ajouté un exemple de classe avec une annotation de validation:

public class MyObject
{
    [StringLength(10, MinimumLength=3)]
    public string Name { get; set; }
}

J'ai ensuite instancié l'objet et essayé d'attribuer à la propriété Name des valeurs inférieures à 3. La propriété affectée correctement, malgré l'annotation indiquant une longueur de chaîne inférieure à 3 n'est pas autorisée.

    static void Main(string[] args)
    {
        MyObject mine = new MyObject();
        mine.Name = "hi";
        Console.WriteLine(mine.Name);
        Console.ReadLine();
    }

Ce petit programme écrit "bonjour" sur la console. Pourquoi? Je m'attendais à ce qu'il s'énerve en essayant de régler mine.Name sur "hi".

Qu'est-ce que je rate?

Merci d'avance.

22
Chev

Vous n'appelez jamais rien pour valider les propriétés. La validation ne se fait pas comme par magie. de http://msdn.Microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

Validation manuelle des valeurs 

Lorsque vous n'utilisez pas le DataGrid contrôle pour fournir l'interface pour édition des données, la validation les attributs ne sont pas automatiquement appliqué. Cependant, vous pouvez manuellement appliquer le test de validation en utilisant le fichier Validator class. Vous pouvez appeler le ValidateProperty méthode sur l'ensemble accesseur d'une propriété pour vérifier le valeur par rapport à la validation attributs pour la propriété. Vous devez définissez également les deuxValidatesOnExceptions et NotifyOnValidationError properties à vrai lorsque la liaison de données à recevoir validation des exceptions à la validation les attributs. Pour un exemple de manuel appliquer la validation, voir les données Exemple de liaison ci-dessous.

16
John Gardner

Comment alors MVC sait-il ajouter erreurs de validation à l’état du modèle dictionnaire?

ModelValidatorProvider , plus spécifiquement, DataAnnotationsModelValidatorProvider . Ceci est appelé par MVC.

3
Max Toro

C # fournit un mécanisme de définition des balises déclaratives, appelé attributs, que vous pouvez placer sur certaines entités de votre source code pour spécifier des informations supplémentaires. Les informations que les attributs contiennent peuvent être récupérés au moment de l'exécution par réflexion.

https://msdn.Microsoft.com/en-us/library/aa288059(v=vs.71).aspx

Voici trois articles pour vous aider à approfondir vos connaissances sur le fonctionnement des attributs. Le dernier étant le moins important si vous comprenez comment vous en servir. L'article est pour Silverlight, mais est toujours applicable au sujet à l'étude. 

Introduction aux attributs

Les attributs

DataTypeAttributes

Utilisation des annotations de données avec silverlight

3
BentOnCoding

parce que vous ne vérifiez pas si le modèle est valide ... la notation de données vérifie la validité du modèle. alors vous aurez votre erreur.

0
njoromwando