3

所以我有以下对象

public class Person : IValidatableObject 
{

[Required]
public string Name {get;set;}
[Required]
public string Status {get;set;
public Address Address {get;set;}
 public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {

            if (Status != "Addressless" && Address == null)
            {
                yield return new ValidationResult("An address is required if this person is not addressless");
            }
        }
}

public class Address 
{
[Required]
public string Address1 {get;set;}
[Required]
public string City {get;set;}
}

现在,我的问题是地址值是必需的,因为如果该人确实有地址,EF Code First 不需要地址表中数据库中的空值。这似乎导致了一个问题,因为 Person 不需要地址,因此如果他们是“无地址”,则不应进行Address验证,但验证仍会启动,因为 Address 具有必填字段。

有没有解决的办法?

4

2 回答 2

2

原因

正如chris-shouts回答类似问题时所描述的那样。

验证对象时,在 Validator.ValidateObject 中应用以下过程:

  1. 验证属性级属性
  2. 如果任何验证器无效,则中止验证返回失败
  3. 验证对象级属性
  4. 如果任何验证器无效,则中止验证返回失败
  5. 如果在桌面框架上并且对象实现了 IValidatableObject,则调用其 Validate 方法并返回任何失败

你的情况

因此,在您的情况下,必需的属性验证会阻止您检查 IValidationObject。

可能的解决方案

可能的解决方案是在验证方法中移动您所需的地址检查

于 2017-04-26T12:26:06.720 回答
1

问题是Required属性是继承的。因此,即使Address不是必需的,当您绑定到视图时,地址的各个属性也是必需的。

您最好的选择是为Address不具有任何属性的视图模型创建一个视图模型,并将一些验证逻辑放在一个单独的类中,甚至放在验证您的域逻辑的控制器中。您可以使用添加验证数据ModelState.AddModelError.

于 2012-11-12T17:15:51.453 回答