2010-07-15 3 views
0

Je me rends compte que je peux simplement ajouter l'attribut [Obligatoire] à une propriété de classe et MVC effectuera automatiquement la validation d'une manière très agréable.Pouvez-vous ajouter des attributs de validation dynamiques dans Asp MVC 2.0?

Ce que je voudrais cependant faire, c'est assigner l'attribut à l'exécution, est-ce possible?

Par exemple, dire que j'ai

public class Cert {  
    public string MedicalNum { get; set; } 

    public int Certified { get; set; } 

... 
} 

Je voudrais rendre la propriété MedicalNum [Obligatoire] (il est correctement validé dans la vue) si la propriété certifiée est définie sur 1.

Est-ce possible?

Répondre

1

Jetez un oeil à ce post on SO. Fondamentalement, prenez l'exemple de validation propertiesMustMatch pour obtenir une idée sur la façon d'utiliser Data Annotations avec plusieurs propriétés. Voici un coup d'œil à ce que votre nouveau code pourrait être (note, probablement pas 100% syntaxiquement correct sur les chapeaux, demi-finales)

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public sealed class RequiredMedicalNum: ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "{0} is required when certified is true"; 

    private readonly object _typeId = new object(); 

public RequiredMedicalNum(string medicalNum, string Certified) 
    : base(_defaultErrorMessage) 
{ 
    _medicalNum = medicalNum; 
    _certified= Certified; 
} 

public string _medicalNum 
{ 
    get; 
    private set; 
} 

public string _certified 
{ 
    get; 
    private set; 
} 

public override object TypeId 
{ 
    get 
    { 
     return _typeId; 
    } 
} 

public override string FormatErrorMessage(string name) 
{ 
    return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
     _medicalNum, _certified); 
} 

public override bool IsValid(object value) 
{ 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
    object medicalNum = properties.Find(_medicalNum, true /* ignoreCase */).GetValue(value); 
    object certified= properties.Find(_certified, true /* ignoreCase */).GetValue(value); 
    if(certified == 1){ 
     Return String.IsNullOrEmpty(medicalNum); 
    } 
} 
} 
+0

Merci Tommy, je vais jeter un oeil sur le lien et je vous remercie de votre code. J'essaierai cet après-midi et d'après son apparence, devrait être exactement ce que je cherche. –

Questions connexes