如何通知用户基于多个属性进行自定义验证

How to notify users for custom validation based on multiple properties

我正在尝试构建涉及两个或更多属性的自定义消息验证。

这是我的 DTO 的简化版本:

public class FooDTO
{
    public int Id { get; set; }
    public int Name { get; set; }
    //more attributes...

    public bool IsValid 
    {
        get
        {                                
            if (string.IsNullOrEmpty(this.Name) && (this.Id == 0))
                return false; //You will have to specify at least one of the following: Id or Name
            if (this.Name == "Boo" && this.ID = 999)
                return false;  //Boo name and Id of 99 are forbidden 
            //More validation ifs.

            return true;
        }
    }
}

我当前的控制器实现如下所示:

public async Task<IActionResult> DoSomething(FooDTO fooDTO)
{            
    if (!FooDTO.IsValid)
        return BadRequest(""); 
    // Rest of code        
}

此实现不通过相应消息确认用户,例如当 IdName 都丢失时,我希望用户收到类似 "You will have to specify at least one of the following: Id or Name" 的通知验证错误。

有没有办法使用 ValidationAttribute 实现对涉及复杂验证的两个以上属性的验证?(这是我的 preferred 解决方案)

或者构建要在 BadRequest(string message) 重载中发送的自定义错误消息的优雅方法?

使用可以使用IValidatableObject实现自定义验证:

public class FooDTO : IValidatableObject
{
    public int Id { get; set; }

    public string Name { get; set; }
    //more attributes...

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrEmpty(Name) && (Id == 0))
            yield return new ValidationResult("You will have to specify at least one of the following: Id or Name", new[] { "Id", "Name" });

        if (Name == "Boo" && Id == 999)
            yield return new ValidationResult("Boo name and Id of 99 are forbidden", new[] { "Id", "Name" });
    }
}

在控制器中:

public async Task<IActionResult> DoSomething(FooDTO fooDTO)
{            
    if (!ModelState.IsValid)
        return BadRequest(ModelState); 

    // Rest of code        
}

有关详细信息,请阅读 Core MVC 和 Razor Pages 中的模型验证