使用Nhibernate Validator(使用S#harp架构/ MVC3),我如何编写自定义属性,最好不是特定于对象(因为这是一个相当常见的要求),强制执行PropertyA> = PropertyB(或在更一般的情况,两者都可能为空)。
像
这样的东西public DateTime? StartDate { get; set; }
[GreaterThanOrEqual("StartDate")]
public DateTime? EndDate { get; set; }
我看到我可以在特定的IsValid
课程中覆盖Entity
,但我不确定这是否是最佳方法,在这种情况下我没有看到如何提供消息
答案 0 :(得分:0)
当您需要比较对象的多个属性作为验证的一部分时,您需要一个claass验证器。然后将该属性应用于类,而不是属性。
我认为没有一个可以做你想做的事情,但写起来很容易。
这是一个代码大纲,大致向您展示验证器的外观
[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
}
}
答案 1 :(得分:0)
目前,如果我需要在模型上执行此操作,我会使用模型实现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;
}
这似乎提供了与现有系统的良好集成。缺点是,由于这不适用于域对象,因此在那里需要额外的逻辑(或者在创建域对象的服务层中等)以便从该端强制执行它,以防在其他地方使用不同的模型创建或更新域对象。