webapi 核心 [FromQuery] dto 模型忽略 [Required(AllowEmptyStrings = true)]

问题描述 投票:0回答:1

我有一个带有两个参数的控制器端点

  1. 从身体发出
  2. 使用 dtoModel 作为查询字符串参数发送

我使用

[FromQuery]
作为第二个对象,因为我无法在体内传递两个对象

public class MyDTO
{

    [Required(AllowEmptyStrings = true), StringLength(50)]

    public string Details { get; set; }

    public int value{ get; set; }

}

API控制器:

   [HttpPost("getDetails")]
   public async Task<List<getDetailsResult>> getDetails(List<string> dbList, [FromQuery] MyDTO data) 
   {}

当我使用“详细信息”字段的空字符串从 Angular 调用 api 时,它会作为 null 发送到 api,例如: http://sitename.com/api/getDetails?Details=&value=100

[Required(AllowEmptyStrings = true)]
属性被忽略,它将返回错误“详细信息字段为必填”

角度 http post 调用:

  public getDetails(
    dbList: string[],
    details: string,
    value: number
  ) {
    let result;
    let params = new HttpParams();

    params = params.append("details", "");   

    params = params.append("value", 100);

    result = this.http.post("/api/getDetails", dbList, {
      params: params,
    });
    return result.toPromise().then((data: any) => {
      //console.log(data);
      return data;
    });
  }

我有两个问题:

  1. 如果值为空字符串,我如何允许使用必需属性调用 api?有什么方法可以将 null 值替换为空字符串吗?
  2. 为什么不能在 url 查询字符串中传递空字符串?
angular get asp.net-core-webapi query-string angular-httpclient
1个回答
0
投票

如果该值,我如何允许使用必需属性调用 api 是空字符串吗?有什么方法可以将 null 值替换为空 字符串?

根据您的场景和共享代码片段,您实际上有两个选择。

首先使用自定义模型验证,另一个选项是ComponentModel.DataAnnotations

如果您想在这种情况下使用客户模型验证,您应该按以下方式重构您的代码:这样,您将对您的模型有更多的控制权。

模型验证器:

public class EmptyStringModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        

        var model = new MyDTO();



        if (bindingContext.ValueProvider.GetValue("Details").FirstOrDefault() == null)
        {
            model.Details = string.Empty;
        }

        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}

型号:

[ModelBinder(BinderType = typeof(EmptyStringModelBinder))]
public class MyDTO
{

    
    [StringLength(50)]

    public string Details { get; set; }

    public int value { get; set; }

}

或者,您也可以使用模型注释。

您可能知道,在 .NET 中,我们有

[DisplayFormat(ConvertEmptyStringToNull = true, NullDisplayText = "[Null]")]
可以将 null 值转换为空字符串 "" 如果未设置此属性,则 null 字段值将显示为空字符串 ("")。所以你可以修改你的模型如下:

public class MyDTO
{

    [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText = "")]
    [StringLength(50)]

    public string Details { get; set; }

    public int value { get; set; }

}

输出:

注意:如果您想查看更多样本,请参考此官方文档

© www.soinside.com 2019 - 2024. All rights reserved.