Frage

Ich habe eine vollständige Validierung auf einem obeject und ich versuche, herauszufinden, den besten Weg, es zu behandeln.

In Anbetracht der folgenden Klasse:

public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

Ich mag ein dataannotation und xval verwenden, um die Klasse zu validieren, bevor ich sie bestehen bleiben, aber ich habe komplexe Validierung, die mehr als eine Eigenschaft erfordert.

Pseudo:

if SendBlankCart {
 - no validation on ToName, ToAddress 
} else {
 ToName - required.
 ToAddress - required. 
}

Ich möchte mit Anmerkungen versehen wie folgt aus:

[LetterResponseValidator]
public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

und haben eine Gültigkeitsregel wie folgt aus:

public class LetterResponseValidator : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if (value.GetType() == typeof(LetterResponse))
            {
                var letterResponse = (letterResponse) value;
                if (letterResponse.SendBlankCard)
                {
                    return true;
                } else
                {
                    if (string.IsNullOrEmpty(letterResponse.FromDisplayName) || string.IsNullOrEmpty(letterResponse.ToAddress1))
                    {
                        return false;
                    }
                    return true;
                }

            }
            return false;
        }
    }

Ich erwarte den Parameter meine Instanz der LetterResponse Klasse zu sein, aber es wird nie auf meinen Validierungs Läufer genannt?

Kennt jemand eine Möglichkeit, dies zu umgehen?

Danke,

Hal

War es hilfreich?

Lösung

Ich glaube nicht, dies mit der Tatsache zu tun, dass Sie einen Klasse-Level-Validator haben. Um eine Verbindung auszuschließen, versuchen Sie einen Dummy erforderlich Validator „AnName“ anwenden und sehen, ob der Prüfer genannt wird oder nicht.

Wenn es aufgerufen wird, dann lassen Sie mich wissen, wenn es nicht ist, dann sollten Sie prüfen, ob Sie Ihre Standard-Modelbinder mit dem DataAnnotationsModelBinder in Ihrer Global.asax.cs Datei überschrieben haben:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

Weitere Informationen zu diesem und voll Demo-Projekt arbeiten, lesen Sie Blog-Artikel über die clientseitige Validierung .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top