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



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

这是我的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都丢失时,我希望用户收到类似"您必须指定以下至少一项:Id或Name"验证错误的通知。

有没有一种方法可以使用ValidationAttribute来实现对涉及复杂验证的两个或更多属性的验证(这是我的首选解决方案(

还是一种优雅的方式来构建要在BadRequest(string message)重载中发送的自定义错误消息?

Use可以使用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        
}

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

相关内容

  • 没有找到相关文章

最新更新