抱歉,我可能在评论中混淆了想法...您应该按照以下方式做一些事情:
首先将 CustomValidation 属性添加到您的类中:
[DataContract]
[CustomValidation(typeof(MediaValidation), "Validate")]
public class Media
{
[DataMember]
public string physical { get; set; }
[DataMember]
public string digital { get; set; }
}
然后创建一个MediaValidation
类(与您在属性中指定的类名相同),并调用一个public
andstatic
方法Validate
(再次在属性中指定),该方法返回一个ValidationResult
... 此方法的第一个参数正是您正在验证的对象。您可以执行以下操作:
public class MediaValidation
{
public static ValidationResult Validate(Media model, ValidationContext context)
{
if (String.IsNullOrWhiteSpace(model.physical) && String.IsNullOrWhiteSpace(model.digital))
return new ValidationResult("Either physical or digital must be specified");
else
return ValidationResult.Success;
}
}
让我知道这是否适合你。
更新:替代解决方案
另一种方法是ValidationAttribute
像您所做的那样扩展,并在类级别(而不是单个属性)应用您的扩展属性。您将需要覆盖该IsValid()
方法:
public class ExclusivelySetAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var model = value as Media;
if (model == null)
return false; // or your logic, throw an exception...
if (String.IsNullOrWhiteSpace(model.physical) && String.IsNullOrWhiteSpace(model.digital))
return false;
return true;
}
}
当您返回 false 时,显示的错误消息将是属性中指定的错误消息:
[ExclusivelySet(ErrorMessage = "Either physical or digital must be specified")]
public class Media
{
//... your code
}
让我知道这种方法如何为您工作。