使用 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
不支持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)
{
// ...
}
我有这个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
不支持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)
{
// ...
}