2010-03-23 6 views
2

Nous essayons d'obtenir un attribut conditionnel à travailler, par exemple, il y a un booléen (case à cocher) qui, s'il est coché, son texte associé est requis. Donc, idéalement, nous aurions quelque chose comme ...Attribut conditionnel requis pour la validation

public bool Provision { get; set; } 

[ConditionalRequirement(IsNeededWhenTrue = Provision)] 
public string ProvisionText { get; set; } 

Est-ce encore possible?

idée Autre (pas aussi élégant?)

public bool Provision2 { get; set; } 

    [PropertyRequired(RequiredBooleanPropertyName = "Provision2")] 
    public string Provision2Text { get; set; } 

Je ne voudrais pas utiliser la méthode de chaîne magique ... mais d'autres idées?

Répondre

0

J'ai fini de rouler le mien. Fondamentalement, vous créez une méthode de validation qui effectue votre vérification normale de yes, no, whatever et les recueille dans une sorte de collection d'erreurs. Le frotter avec ceci est de le renvoyer au modèle lui-même. Donc, je suis devenu paresseux et fortement typé comme tel ...

public static void AddError<T>(this ErrorCollection errorCollection, Expression<Func<T, object>> expression, string friendlyUiName) 
{ 
    var propertyName = GetPropertyName(expression.ToString(), expression.Parameters[0].Name); 
    var propertyInfo = typeof (T).GetProperty(propertyName); 
    var resultError = DetermineOutput(friendlyUiName, propertyInfo.PropertyType); 
    errorCollection.Errors.Add(new ValidationError(propertyName, resultError)); 
} 

alors vous êtes des déclarations de validation ont quelque chose comme ça dans les ...

if (FirstName.IsEmpty()) 
     EntityErrorCollection.AddError<SomeClass>(x => x.FirstName, "First Name"); 

Ensuite, dans le contrôleur, un simple vérifier et le port en arrière au modèle si elle (n'est pas valable bien sûr) ...

foreach (var error in someObject.EntityErrorCollection.Errors) 
     ModelState.AddModelError(error.Property, error.Message); 

il y a probablement une façon plus propre de faire cela, mais jusqu'à présent, cela a été fonctionne très bien.

Questions connexes