验证消息未显示模型

时间:2016-05-31 11:29:06

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

型号:

public class Person : IValidatableObject
{
    public Address ResidentialAddress { get; set; }
    public Address PostalAddress { get; set; }
}

public class Address 
{
    public string Address1 { get; set; }
}
模型中的

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
     if (string.IsNullOrWhiteSpace(PostalAddress.Address1))
     {
          yield return
                  new ValidationResult("Postal address is required",
                      new[] { nameof(PostalAddress.Address1) });
     }
}

查看:(查看人员内部地址的部分视图)

@Html.ValidationMessageFor(m => m.Address1)

在html中,名称为PostalAddress.Address1,ID为PostalAddress_Address1

不幸的是nameof(PostalAddress.Address1)只返回Address1

我尝试将其替换为PostalAddress.Address1PostalAddress_Address1,但无法显示错误。

秘密是什么?

1 个答案:

答案 0 :(得分:0)

我认为@MikeDebela在您的回答下方的评论中是正确的。如果您要使用这样的自定义模型验证,您的模型需要实现IValidatableObject。但是,这不是你唯一的问题。

首先,您是否有一个特殊原因而不仅仅依赖于[Required]属性?对于这么简单的事情,自定义模型验证有点浪费。如果问题是这是您的实际实体类,并且您不希望Address1列在数据库级别不可为空,那么这就是视图模型的用途。使用它们。您可以仅在视图模型上创建所需的属性。作为最佳实践,您不应该直接利用您的实体类发布到。

此外,你永远不会新手PostalAddress。当模型绑定器在post上执行其操作时,如果未发布相关类的属性,则会将该相关类的值保留为null。然后,任何null的相关类也不会被验证。因此,如果唯一的属性为Address1,而您未发布Address1,那么PostalAddressnull,并且没有属性,特别是{{1 },将参与验证。