Domanda

Utilizzo del validatore Nibernate (con S # Harp Architecture / MVC3), come posso scrivere un attributo personalizzato, preferibilmente non specifico per oggetto (poiché questo è un requisito abbastanza comune) che impone a quella proprietà>= proprietàb (o in altroCaso generale, entrambi potrebbero essere nulle).

Qualcosa come

public DateTime? StartDate { get; set; }

[GreaterThanOrEqual("StartDate")]
public DateTime? EndDate { get; set; }
.

Vedo che posso sovrascrivere IsValid nella particolare classe Entity, ma non ero sicuro se fosse il miglior approccio, e non ho visto come fornire un messaggio in quel caso.

È stato utile?

Soluzione

Quando è necessario confrontare più proprietà di un oggetto come parte della convalida, è necessario un validatore CLAASS.L'attributo viene quindi applicato alla classe, non alla proprietà.

Non penso che ci sia uno esistente per fare ciò che vuoi, ma è abbastanza facile da scrivere il tuo.

Ecco un contorno di codice per mostrarti approssimativamente ciò che il tuo validatore potrebbe apparire come

[AttributeUsage(AttributeTargets.Class)]
[ValidatorClass(typeof(ReferencedByValidator))]
public class GreaterThanOrEqualAttribute : EmbeddedRuleArgsAttribute, IRuleArgs
{        
    public GreaterThanOrEqualAttribute(string firstProperty, string secondProperty)
    {
        /// Set Properties etc
    }
}

public class ReferencedByValidator : IInitializableValidator<GreaterThanOrEqualAttribute>
{       
    #region IInitializableValidator<ReferencedByAttribute> Members

    public void Initialize(GreaterThanOrEqualAttribute parameters)
    {
        this.firstProperty = parameters.FirstProperty;
        this.secondProperty = parameters.SecondProperty;
    }

    #endregion

    #region IValidator Members

    public bool IsValid(object value, IConstraintValidatorContext constraintContext)
    {
       // value is the object you are trying to validate

        // some reflection code goes here to compare the two specified properties
   }
    #endregion

}
.

}

Altri suggerimenti

Attualmente, se ho bisogno di farlo su un modello, ho il modello implementazione IValidatableObject

public class DateRangeModel : IValidatableObject {

   public DateTime StartDate { get; set; }
   public DateTime EndDate { get; set; }


   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> results = new List<ValidationResult>();
        if (StartDate > EndDate)
        {
            results.Add(new ValidationResult("The Start Date cannot be before the End Date.", "StartDate"));
        }
        return results;
    }
.

Questo sembra fornire una buona integrazione con il sistema esistente.Lo svantaggio è che poiché questo non viene applicato sull'oggetto di dominio, è necessario aggiungere ulteriore logica (o in uno strato di servizi che crea gli oggetti di dominio, ecc.) Per applicarsi anche da tale fine, nel caso in cui un modello diverso viene utilizzato altrovePer creare o aggiornare gli oggetti di dominio.

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