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



我有这个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.'

这可能吗?

由于默认的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;
}
}

则可以使用ModelBinderAttributeBoolModelBinder类型指定为此绑定器。

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

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

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

相关内容

  • 没有找到相关文章

最新更新