【问题标题】:Calling MVC IValidatableObject on nested object在嵌套对象上调用 MVC IValidatableObject
【发布时间】:2012-11-12 15:30:22
【问题描述】:

所以我有以下对象

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 具有必填字段。

有没有办法解决这个问题?

【问题讨论】:

标签: asp.net .net asp.net-mvc


【解决方案1】:

原因

正如chris-shoutsanswer 中描述的类似问题。

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

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

你的情况

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

可能的解决方案

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

【讨论】:

  • 如果您认为这是重复的,请将其标记出来。
  • 已修复。在我看来,问题相似但不重复
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多