Domanda

Ho una validazione completa su un obeject e sto cercando di capire il modo migliore per gestire la cosa.

Data la seguente classe:

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

voglio usare un dataannotation e xval al fine di convalidare la classe prima che io insisto, ma ho convalida complesso che richiede più di una proprietà.

Pseudo:

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

Vorrei annotare in questo modo:

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

e hanno una regola di convalida in questo modo:

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;
        }
    }

Mi aspetto il parametro da mia istanza della classe LetterResponse, ma non è mai viene chiamato sul mio corridore convalida?

Qualcuno sa un modo per gestire questa situazione?

Grazie,

Hal

È stato utile?

Soluzione

Non credo che questo abbia a che fare con il fatto che si dispone di un validatore a livello di classe. Per escludere qualsiasi connessione, provate ad applicare un manichino validatore richiesto per "ANome" e vedere se il validatore si chiama o no.

Se viene chiamato, poi fatemi sapere, se non lo è, allora si dovrebbe verificare se è stato sovrascritto il vostro modelbinder di serie con il DataAnnotationsModelBinder nel file Global.asax.cs:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

Per maggiori dettagli su questo e completamente funzionante progetto demo, leggere questo articolo di blog sulla convalida lato client .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top