如何通知用户基于多个属性进行自定义验证
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
}
此实现不通过相应消息确认用户,例如当 Id
和 Name
都丢失时,我希望用户收到类似 "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 中的模型验证
我正在尝试构建涉及两个或更多属性的自定义消息验证。
这是我的 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
}
此实现不通过相应消息确认用户,例如当 Id
和 Name
都丢失时,我希望用户收到类似 "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 中的模型验证