.NET WebAPI DataModel - “一个或另一个元素”所需的数据注释

时间:2013-04-03 10:49:47

标签: .net asp.net-web-api model-validation

我的网络服务需要接受包含许多元素的模型。该域名是广播媒体。

该模型的一个要求是它包含一个<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应用于属性,但在这种情况下,这不是我想要的,因为我想要一个元素或另一个元素。

在这种情况下,是否仍然使用属性进行模型验证?

1 个答案:

答案 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;
    }
}

让我知道这种方法对你有用。