1

DI 创建了两个自定义验证属性。完成日期验证后,我想进行时间验证,但要做到这一点,我需要 MyDate。如何从时间验证中访问 MyDate?

我的模型:

[DateValidation()]
public DateTime MyDate { get; set;}

[TimeValidation()]
public TimeSpan MyTime { get; set;}

我的时间验证:

public class TimeValidation: ValidationAttribute
{
    public override bool IsValid(object value)
    {
        TimeSpan time = (TimeSpan)value;
        DateTime MyDate //How can I get this?
        // Do stuff
        // return something good
    }       
}
4

1 回答 1

1

如果您检查MSDN,它会说IsValid方法:

确定对象的指定值是否有效。

而且,关于它的value参数IsValid说:

value 类型:System.Object 要验证的对象的值。

因此,您所谓的日期是value,您只需将其向下转换为DateTime

DateTime MyTime = (DateTime)value;

更新

那不是我真正想要的。我知道如何用价值进行验证。但在我给你的模糊示例中,价值是 MyTime。但是我在 MyTime 的验证中也需要 MyDate。(我故意忽略了 MyDate 的验证,因为它正在工作)

你不能那样做。归根结底,您正在实现一个属性,而属性是一个类型元数据详细信息。换句话说:他们不知道他们应用到的对象。

您需要的是IsValid(object, ValidationContext)重载,ValidationContext它将为您提供要验证的对象作为ObjectInstance属性。

因此,您可以使用反射访问其他属性:

DateTime MyDate = (DateTime)validationContext.ObjectInstance.GetType()
                    .GetProperty("MyDate", BindingFlags.Public | BindingFlags.Instance)
                    .GetValue(validationContext.ObjectInstance);

我还将为调用的TimeValidation属性添加一个参数relatedPropertyName,以便不对相关的属性名称进行硬编码。

于 2015-07-01T09:31:22.820 回答