1

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

模型的要求之一是它包含一个<digital></digital>元素或一个<physical></physical>元素。

所以这是可以接受的:

<media>
  <digital>video/x-mxf</digital>
</media>

或者:

<media>
  <physical>Betacam</physical>
</media>

我的班级是这样的:

[DataContract]
public class Media
{
   [DataMember]
   public string physical { get; set; }
   [DataMember]
   public string digital { get; set; }
}

在 WebAPI 中,我显然可以将RequiredAttribute 应用于属性,但这不是我在这种情况下想要的,因为我想要一个元素或另一个元素。

在这种情况下,是否有使用属性进行模型验证的方法?

4

1 回答 1

3

抱歉,我可能在评论中混淆了想法...您应该按照以下方式做一些事情:

首先将 CustomValidation 属性添加到您的类中:

[DataContract]
[CustomValidation(typeof(MediaValidation), "Validate")] 
public class Media
{
    [DataMember]
    public string physical { get; set; }
    [DataMember]
    public string digital { get; set; }
}

然后创建一个MediaValidation类(与您在属性中指定的类名相同),并调用一个publicandstatic方法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
}

让我知道这种方法如何为您工作。

于 2013-04-17T15:27:14.700 回答