我有这个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
不支持1
到bool
,我们可以尝试通过实现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)
{
// ...
}
最简单的方法是将输入参数类型更改为string
[HttpGet("foo")]
public IActionResult Foo([FromQuery] string parameter)
{
if( parameter=="true" || parameter=="1") ....
else if( parameter=="false" || parameter=="0") ....
else ....
}