2013-07-22 11 views
6

Ich habe eine Liste von Paar Radiobuttons (Ja/Nein):Wie kann eine Eigenschaft basierend auf mehreren Bedingungen erstellt werden?

Q1.(Y)(N) 
Q2.(Y)(N) 
Q3.(Y)(N) 
Q4.(Y)(N) 

und ich habe eine Eigenschaft in meinem Modell public string MedicalExplanation { get; set; }

Mein Ziel ist es Erklärung erforderlich, wenn eine der Radio zu machen Die Schaltfläche wurde auf "True" gesetzt.

Mein erster Versuch war, [Required] zu verwenden, aber es behandelt Bedingungen nicht.

Dann habe ich beschlossen Drittes Tool wie MVC Foolproof Validierung verwenden ich es wie folgt verwendet: [RequiredIf("Q1", true, ErrorMessage = "You must explain any \"Yes\" answers!")]

Nun das Problem ist, ich weiß nicht, wie es, wenn eine der anderen Q2 erforderlich zu machen, Q3, Q4 wird überprüft.

Bitte Rat

Antwort

15

In Ihrem Ansichtsmodell, erstellen Sie eine Bool propery wie folgt aus:

public bool IsMedicalExplanationRequired 
{ 
    get 
    { 
     return Q1 || Q2 || Q3 || Q4; 
    } 
} 

Verwenden Sie dann Ihre RequiredIf Attribut wie folgt aus:

[RequiredIf("IsMedicalExplanationRequired", true, ErrorMessage = "You must explain any \"Yes\" answers!")] 

UPDATE:

Wenn Ihre Q1 - Q4 Eigenschaften vom Typ bool? sind, ändern Sie einfach die IsMedicalExplanationRequired Eigenschaft wie unten:

public bool IsMedicalExplanationRequired 
{ 
    get 
    { 
     return Q1.GetValueOrDefault() || Q2.GetValueOrDefault() || Q3.GetValueOrDefault() || Q4.GetValueOrDefault(); 
    } 
} 
+0

in meiner Anwendung Q1, Q2, Q3, Q4 sind boolesche (ja oder nein), so bekomme ich den Fehler "Operator '||" Kann nicht auf Operanden vom Typ 'bool' angewendet werden. ' – meda

+0

Siehe die aktualisierte Antwort. – ataravati

+0

Großartig! Du bist der beste ! Haha! – meda

3

Dies ist, wie ich es tat:

Zuerst habe ich eine benutzerdefinierte Validierung Attribut erstellt, die ein String-Array von Feldern wird in geben überprüfen:

public class ValidateAtLeastOneChecked : ValidationAttribute { 
    public string[] CheckBoxFields {get; set;} 
    public ValidateAtLeastOneChecked(string[] checkBoxFields) { 
     CheckBoxFields = checkBoxFields; 
    } 

    protected override ValidationResult IsValid(Object value, ValidationContext context) { 
     Object instance = context.ObjectInstance; 
     Type type = instance.GetType(); 

     foreach(string s in CheckBoxFields) { 
      Object propertyValue = type.GetProperty(s).GetValue(instance, null); 
      if (bool.Parse(propertyValue.ToString())) { 
       return ValidationResult.Success; 
      } 
     } 
     return new ValidationResult(base.ErrorMessageString); 
    } 
} 

Dann benutze ich es so (ich verwende Ressourcendateien, um meine Fehlermeldungen zu lokalisieren):

[ValidateAtLeastOneChecked(new string[] { "Checkbox1", "Checkbox2", "Checkbox3", "Checkbox4" }, ErrorMessageResourceType=typeof(ErrorMessageResources),ErrorMessageResourceName="SelectAtLeastOneTopic")] 
public bool Checkbox1{ get; set; } 
public bool Checkbox2{ get; set; } 
public bool Checkbox3{ get; set; } 
public bool Checkbox4{ get; set; } 

Es wird nur der Fehler in der ersten Checkbox gesetzt. Wenn Sie die eingebaute css-Hervorhebung verwenden, um fehlerhafte Felder hervorzuheben, müssen Sie dies leicht ändern, damit es richtig aussieht, aber ich fand, dass dies eine saubere Lösung war, die wiederverwendbar war und mir die Unterstützung von Ressourcendateien ermöglichte in Validierungsattributen.

+0

Dies ist eine nette Annäherung, ich werde versuchen, wenn ich eine Chance +1 bekomme – meda

Verwandte Themen