使用 FromQueryAttribute 将 int 值 (1,0) 转换为布尔值

Convert int values (1,0) to boolean using FromQueryAttribute

我有这个API方法:

  [HttpGet("foo")]
  public IActionResult Foo([FromQuery] bool parameter)
  {
    // ...
  }

而且我知道我可以像这样调用我的方法,它会起作用:

.../foo?parameter=true

但我也想支持数值 0 和 1 并像这样调用我的方法:

.../foo?parameter=1

但是当我尝试时,我在 System.Private.CoreLib

中得到了这个异常
System.FormatException: 'String '1' was not recognized as a valid Boolean.'

这可能吗?

最简单的方法是将输入参数类型更改为字符串

[HttpGet("foo")]
  public IActionResult Foo([FromQuery] string parameter)
  {
    if( parameter=="true" || parameter=="1") ....
    else if( parameter=="false" || parameter=="0") ....
    else ....
  }

因为默认的ModelBinder不支持1bool,我们可以尝试通过实现IModelBinder接口来创建自己的绑定逻辑。

public class BoolModelBinder : IModelBinder {
    public Task BindModelAsync(ModelBindingContext bindingContext) {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue;

        if (int.TryParse(value, out var intValue)) {
            bindingContext.Result = ModelBindingResult.Success(intValue == 1);

        } else if (bool.TryParse(value, out var boolValue)) {
            bindingContext.Result = ModelBindingResult.Success(boolValue);

        } else if (string.IsNullOrWhiteSpace(value)) {
            bindingContext.Result = ModelBindingResult.Success(false);
        } 
        
        return Task.CompletedTask;
    }
}

然后我们可以使用 ModelBinderAttribute 将我们的 BoolModelBinder 类型指定为该活页夹。

[HttpGet("foo")]
public IActionResult Foo([ModelBinder(typeof(BoolModelBinder))] bool parameter)
{
  // ...
}