我的网络服务需要接受包含许多元素的模型。该域名是广播媒体。
该模型的一个要求是它包含一个<digital></digital>
元素或一个<physical></physical>
元素。
所以这是可以接受的:
<media>
<digital>video/x-mxf</digital>
</media>
OR:
<media>
<physical>Betacam</physical>
</media>
我的班级看起来像这样:
[DataContract]
public class Media
{
[DataMember]
public string physical { get; set; }
[DataMember]
public string digital { get; set; }
}
在WebAPI中,我显然可以将RequiredAttribute应用于属性,但在这种情况下,这不是我想要的,因为我想要一个元素或另一个元素。
在这种情况下,是否仍然使用属性进行模型验证?
答案 0 :(得分:3)
对不起,我可能会在评论中混淆思路......你应该按照以下方式做点什么:
首先将CustomValidation属性添加到您的类中:
[DataContract]
[CustomValidation(typeof(MediaValidation), "Validate")]
public class Media
{
[DataMember]
public string physical { get; set; }
[DataMember]
public string digital { get; set; }
}
然后创建一个MediaValidation
类(在属性中指定的相同类名),使用名为public
的{{1}}和static
方法(再次在属性中指定) ),返回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()
当您返回false时,显示的错误消息将是属性中指定的错误消息:
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;
}
}
让我知道这种方法对你有用。