簡體   English   中英

在 aspnet 核心中驗證 model 時不需要 null 集合元素

[英]Require not null collection elements in when validating model in aspnet core

我有示例模式 class:

public class Data
{
        [Required]
        [MinLength(1)]
        public List<Foo> Foos{ get; set; }
}

傳遞給 controller:

[ApiController]
public class FooController : ControllerBase
{
  public async Task<IActionResult> Post([FromBody] Data data)
  {
      // Do stuff
  }
}

我在我的項目配置中啟用了可為空的注釋。

如何強制 model 驗證器拒絕使用 null foos 數組的請求? 例如,controller 接受以下請求:

{
   foos: [null]
}

我希望這樣的請求返回錯誤的請求狀態代碼。

使用數據注釋時,子類不會被驗證。 我建議對所展示的用例進行Fluent Validation

使用很簡單,只要定義一個規則

public class DataValidator : AbstractValidator<Data>
{
    public DataValidator()
    {
        // RuleFor(r => r.Foos).NotEmpty(); // <-- not needed as Nullable Annotations are enabled
        RuleForEach(r => r.Foos).NotNull();
    }
}

並在配置服務方法中注冊FluentValidation

services.AddControllers()
            .AddFluentValidation(configuration => configuration.RegisterValidatorsFromAssemblyContaining<Startup>());

您可以自定義 ValidationAttribute 來自定義規則:

自定義驗證屬性:

public class ValidArray : ValidationAttribute
{
    protected override ValidationResult
            IsValid(object value, ValidationContext validationContext)
    {
        var model = (Data)validationContext.ObjectInstance;
        if(Extension.IsNullOrEmpty<Foo>(model.Foos))
        {
            return new ValidationResult
                ("Array cannot be null");
        }
        else
        {
            return ValidationResult.Success;
        }
    }
}

自定義IsNullOrEmpty

public static class Extension
{
    public static bool IsNullOrEmpty<T>(List<T> array) where T : class
    {
        if (array == null || array.Count == 0)
            return true;
        else
            return array.All(item => item == null);
    }
}

Model:

public class Data
{
    //[Required]
    [MinLength(1)]
    [ValidArray]
    public List<Foo> Foos { get; set; }
}
public class Foo
{
    public int Id { get; set; }
    public int Count { get; set; }
}

結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM