型号:
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.Address1
和PostalAddress_Address1
,但无法显示错误。
秘密是什么?
答案 0 :(得分:0)
我认为@MikeDebela在您的回答下方的评论中是正确的。如果您要使用这样的自定义模型验证,您的模型需要实现IValidatableObject
。但是,这不是你唯一的问题。
首先,您是否有一个特殊原因而不仅仅依赖于[Required]
属性?对于这么简单的事情,自定义模型验证有点浪费。如果问题是这是您的实际实体类,并且您不希望Address1
列在数据库级别不可为空,那么这就是视图模型的用途。使用它们。您可以仅在视图模型上创建所需的属性。作为最佳实践,您不应该直接利用您的实体类发布到。
此外,你永远不会新手PostalAddress
。当模型绑定器在post上执行其操作时,如果未发布相关类的属性,则会将该相关类的值保留为null
。然后,任何null的相关类也不会被验证。因此,如果唯一的属性为Address1
,而您未发布Address1
,那么PostalAddress
为null
,并且没有属性,特别是{{1 },将参与验证。