4

我对一个对象进行了完整的验证,并试图找出处理它的最佳方法。

给定以下课程:

public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

我想使用 dataannotation 和 xval 在持久化类之前对其进行验证,但我有复杂的验证,需要多个属性。

伪:

if SendBlankCart {
 - no validation on ToName, ToAddress 
} else {
 ToName - required.
 ToAddress - required. 
}

我想这样注释:

[LetterResponseValidator]
public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

并有这样的验证规则:

public class LetterResponseValidator : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if (value.GetType() == typeof(LetterResponse))
            {
                var letterResponse = (letterResponse) value;
                if (letterResponse.SendBlankCard)
                {
                    return true;
                } else
                {
                    if (string.IsNullOrEmpty(letterResponse.FromDisplayName) || string.IsNullOrEmpty(letterResponse.ToAddress1))
                    {
                        return false;
                    }
                    return true;
                }

            }
            return false;
        }
    }

我希望参数是我的 LetterResponse 类的实例,但它永远不会在我的验证运行器上被调用?

有谁知道处理这个问题的方法?

谢谢,

哈尔

4

1 回答 1

3

我认为这与您拥有类级验证器这一事实无关。要排除任何连接,请尝试将虚拟所需的验证器应用于“ToName”并查看是否调用了验证器。

如果它被调用,那么让我知道,如果不是,那么你应该检查你是否已经用 Global.asax.cs 文件中的 DataAnnotationsModelBinder 覆盖了你的标准模型绑定器:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

有关此完整演示项目的更多详细信息,请阅读有关客户端验证的博客文章

于 2009-08-28T16:56:48.307 回答