.net 禁用特定DTO的数据注解

qrjkbowd  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(153)

我想在某些情况下禁用数据注解验证。假设我们有两个DTO和两个端点

public class CreateBulkProductDto 
{
        [Required]
        public List<CreateProductDto> Products { get; set; }
 }

public class CreateProductDto {
    [Required]
    [StringLength(100)]
    public string Name { get; set; }
    [Required]
    public List<CreateProductCategoryDto> Categories { get; set; }
    [Required]
    public List<string> Barcodes { get; set; }

}

终点;

public virtual async Task<List<CreateOrUpdateBulkProductResultDto>> CreateBulkAsync(CreateBulkProductDto input){.....}
public virtual async Task<string> CreateAsync(CreateProductDto input){....}

当请求到达BullkAsync时,我希望禁用验证,但当请求到达BullkAsync时,我希望验证起作用。我该怎么解决这个问题

9bfwbjaz

9bfwbjaz1#

我为此写了一个扩展方法。它目前只适用于单个键值。但我想你能自己扩展这个。
只有在显式检查ModelState.IsValid时,此代码才能工作。

If (!ModelState.IsValid) { return; }

请确保不要过度使用它,因为无论如何都不建议跳过验证。

public static bool MarkFieldsValid(this ModelStateDictionary modelState, string key)
{
    if (string.IsNullOrWhitespace(key)) { return false; }
    
    var modelStates = modelState.FindKeysWithPrefix(key);

    foreach (var state in modelStates)
    {
        modelState.ClearValidationState(state.Key);
        modelState.MarkFieldValid(state.Key);
    }

    return true;
}

然后你可以像这样实现它:

ModelState.MarkFieldsValid("key");

If (!ModelState.IsValid) { return; }

相关问题