Nibera della data di inizio del validatore prima della data di fine
-
14-11-2019 - |
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.
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.