【问题标题】:How to stop model validation propagation on a property with multiple attributes如何在具有多个属性的属性上停止模型验证传播
【发布时间】:2016-06-23 17:13:03
【问题描述】:

我的 web api 中有以下模型

public class MyModel
{
    [Required(ErrorMessage = "Date is required")]
    [ValidDate(ErrorMessage = "Not a valid date format")]
    [ValidStartDate(ErrorMessage = "Not a valid start date")]
    public string startDate { get; set; }


    [Required(ErrorMessage = "Date is required")]
    [ValidDate(ErrorMessage = "Not a valid date format")]
    [IsDateAfterOrOnStartDate("startDate", ErrorMessage = "end date must be greater than or equal to start date")]
    public string endDate { get; set; }

}

我在自定义属性 ValidDateAttribute、ValidStartDateAttribute 和 IsDateAfterOrOnStartdateAttribute 中实现了一些自定义逻辑。但我想要的是,如果 ValidDateAttribute(在两个属性上)给出错误或模型验证失败。我不希望框架在 startDate 属性上执行 ValidStartDateAttribute 并在 endDate 属性上执行 IsDateAfterOrOnStartDateAttribute,换句话说,我希望模型验证在不进一步传播和执行这些属性上的其他属性的情况下自行停止它。

有没有我可以达到预期的结果?

【问题讨论】:

    标签: c# asp.net-web-api data-annotations


    【解决方案1】:

    不确定您是否能够完全按照自己的意愿行事,但从逻辑上讲,如果没有值或无效值,其他验证属性就没有意义。因此,您可以很容易地让他们在添加自己的验证错误之前执行相同的检查。换句话说,如果没有值,则让 ValidDate 不添加其错误,如果没有值或该值不是有效日期,则让 IsDateAfterOrOnStartDate 不添加其错误。最终结果将是您想要的。

    【讨论】:

    • 嗯,这就是我之前的想法,但是如果我在一个验证器中检查两个不同的条件并使用该验证器和硬代码“ErrorMessage = ....”用一些自定义来装饰一个属性,那么问题就来了消息无论这两个条件中的哪个条件失败,我都只能将一条消息发送回客户端。
    • 我的意思是建议每个规则仍然只会触发(中断)单个条件,但是第二条和第三条规则只会在检查更简单的条件后检查它们的条件。用户只会看到失败的最简单规则的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多