【问题标题】:Validation message not showing for property of sub class of model未显示模型子类属性的验证消息
【发布时间】:2016-05-31 11:29:05
【问题描述】:

型号:

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 替换它,但无法显示错误。

秘诀是什么?

【问题讨论】:

  • 你的模型需要实现IValidatableObject
  • Person 实际上是一个视图模型,它被简化为问题。验证有效,我只想知道如何显示错误...

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


【解决方案1】:

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

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

另外,你永远不会更新PostalAddress。当模型绑定器在 post 上执行它的操作时,如果没有发布相关类的属性,它将将该相关类的值保留为 null。然后,任何为空的相关类也不会被验证。因此,如果唯一的属性是Address1,而你没有发布Address1,那么PostalAddress 就是null,并且它上面没有任何属性,具体来说是Address1,将参与验证。

【讨论】:

  • 我不能使用Required属性,因为它并不总是必需的,只有在未设置ResidentialAddress.Address1时才需要PostalAddress.Address1。
  • 我无法控制数据库
  • 我也在实现:IValidatableObject 但忘记将其添加到示例代码中,抱歉
  • 更有理由使用视图模型。这样一来,您就可以完全不理会实体,仍然可以执行您的应用程序需要的任何操作。
  • 我可以添加一个视图模型..但仍然会遇到同样的问题。逻辑不会改变。
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多