2010-11-03 1 views
4

Normalement, ModelBinding Validation d'un membre de la classe peut être fait comme dans cet exemple:Possibilité de modifier les annotations de données pendant l'exécution? (ASP.NET MVC de [Range] [Obligatoire] [StringLength], etc.)

public Class someclass 
{ 
    [StringLength(50)] 
    public string SomeValue { get; set; } 
} 

SomeValue est limité à 50 caractères au maximum . Est-il possible de faire passer la constante (50) à quelque chose d'autre à l'exécution, par exemple, pendant la construction de chaque instance de cette classe, de sorte qu'il est possible d'avoir des instances différentes avec des limitations StringLength différentes?

Si oui, comment fait-on cela?

Répondre

11

Oui. Mais le seul moyen est de créer votre propre implémentation de DataAnnotationsModelValidatorProvider, puis de l'enregistrer dans Global.ascx.cs. Vous ne pouvez pas supprimer simplement les attributs lors de l'exécution MAIS interupt les entrailles MVC qui les lisent:

public class ConventionModelValidatorProvider : DataAnnotationsModelValidatorProvider 
{ 
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) 
    { 
     List<Attribute> newAttributes = new List<Attribute>(attributes); 
     if(mycondition == true) 
     { 
      //get rid of the existing attribute 
      newAttributes.Remove(newAttributes.OfType<StringLengthAttribute>().First()); 


      //add a new one 
      newAttributes.Add(new StringLengthAttribute(5324)); 
     } 

     return base.GetValidators(metadata, context, newAttributes); 
    } 
} 

Registre:

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new CustomValidatorProvider()); 
+1

Hmmm ... Peut-être, je aurais dû demander « Est-il un moyen facile de fais ça? " - D'accord, merci pour la réponse. Je vais juste faire une validation manuelle dans le contrôleur car je n'ai qu'à cocher un champ. À votre santé. – Pretzel

Questions connexes