了解属性具有多个验证属性的模型中的有效性

本文关键字:属性 模型 有效性 验证 了解 | 更新日期: 2023-09-27 17:53:51

我正在开发一个MVC应用程序,我编写的一些模型代码像这样展开:

public class SomeModel
{
    public int? CodeA { get; set; }
    public int? CodeB { get; set; }
    [RequiredIf("CodeA", 3, ErrorMessage = "(required for [Something]!)")]
    [RequiredIf("CodeB", 99, ErrorMessage = "(required for [Other]!)")]
    public string Foo { get; set; }
    // SNIP: Unimportant details
}

注意:我使用的RequiredIf()实现在这里找到。

我已经用两个RequiredIf()属性装饰了属性Foo,用户可以在某些情况下编辑它。有两种不同的情况需要填写。在所有其他情况下,前端将解析用户的输入,并在"幕后"为他们填充。

问题:如果只满足一个情况(例如CodeA = 3, CodeB = 4),并且用户没有输入任何东西从而导致否定验证,模型是否仍然被标记为无效并记录ErrorMessage ?或者,由于满足了代码B的条件,如果CodeA处于需要(而不是输入)的状态,是否会覆盖执行的验证?

另一种提问的方式是:验证是附加的,还是对一次只有一个验证的结果有隐式限制?

了解属性具有多个验证属性的模型中的有效性

验证为否定。为了通过验证,所有验证器必须确认该字段是有效的。因此,对于Foo,如果CodeA验证器通过而CodeB验证器失败,则验证将失败。Modelstate将包含该字段的单个错误。如果两者都失败,modelstate将包含该字段的两个错误。