2010-01-25 2 views
2

Quelqu'un peut-il expliquer pourquoi il est supposé qu'une propriété de type non nullable doit toujours avoir une RequiredAttribue? J'essaye d'écrire une aide d'étiquette qui s'ajoutera automatiquement * ou changera la classe de css afin que je puisse indiquer à l'utilisateur que le champ est exigé. Toutefois, lors de l'interrogation des métadonnées, les propriétés non nulles se terminent par un attribut obligatoire.ASP.NET MVC - Annotations de données - Pourquoi ajouter un attribut RequiredAttribute par défaut?

MVC Source Code:

protected override IEnumerable<ModelValidator> GetValidators(
    ModelMetadata metadata, ControllerContext context, 
    IEnumerable<Attribute> attributes) 
{ 
    _adaptersLock.EnterReadLock(); 

    try 
    { 
     List<ModelValidator> results = new List<ModelValidator>(); 

     if (metadata.IsRequired && 
      !attributes.Any(a => a is RequiredAttribute)) 
     { 
      //******* Why Do this? 
      attributes = attributes.Concat(new[] { new RequiredAttribute() }); 
     } 

     foreach (ValidationAttribute attribute in 
      attributes.OfType<ValidationAttribute>()) 
     { 
      DataAnnotationsModelValidationFactory factory; 

      if (!_adapters.TryGetValue(attribute.GetType(), out factory)) 
       factory = _defaultFactory; 

      results.Add(factory(metadata, context, attribute)); 
     } 

     return results; 
    } 
    finally 
    { 
     _adaptersLock.ExitReadLock(); 
    } 
} 

Répondre

2

Personnellement, je pense qu'il est parce que les concepteurs du cadre ont manqué le point avec les données nullables!

Il semblerait qu'ils aient supposé que si un champ n'est pas NULL, il doit être requis. Malheureusement, comme vous l'avez sans doute découvert, ce n'est pas toujours le cas.

L'exemple le plus courant de ce que je peux penser est un champ de texte qui est fourni par un utilisateur qui pourrait être vide, mais vous voulez le garder comme NULL jusqu'à ce que l'utilisateur a fourni une valeur. Dans ce cas, vous obtenez trois cas valides: 'Non défini' (NULL), 'Vide' (pas NULL) ou une valeur réelle. Donc, pour répondre à votre question, non, je ne peux pas l'expliquer. Peut-être que c'est une erreur?

+0

Exactement. Cela rend la propriété 'requise' très confuse et inutilisable. Depuis, j'ai trouvé Jeremy Skinner avec les mêmes problèmes. http://www.jeremyskinner.co.uk/2010/01/13/limitations-of-mvc2s-modelvalidatorproviders/ – redsquare

Questions connexes