我有一个WebApi方法,如下所示:
public string Get([FromUri] SampleInput input)
{
//do stuff with the input...
return "ok";
}
输入定义如下:
public class SampleInput
{
// ...other fields
public bool IsAwesome { get; set; }
}
实际上,它可以正常工作:如果我在查询字符串中传递&isAwesome=true
,则参数将使用值true
进行初始化。
我的问题是,我想同时接受&isAwesome=true
和&isAwesome=1
作为true
值。目前,第二个版本将导致IsAwesome
在输入模型中为false
。
在阅读有关该主题的各种博客文章后,我尝试了定义HttpParameterBinding
:
public class BooleanNumericParameterBinding : HttpParameterBinding
{
private static readonly HashSet<string> TrueValues =
new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase);
public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
{
}
public override Task ExecuteBindingAsync(
ModelMetadataProvider metadataProvider,
HttpActionContext actionContext,
CancellationToken cancellationToken)
{
var routeValues = actionContext.ControllerContext.RouteData.Values;
var value = (routeValues[Descriptor.ParameterName] ?? 0).ToString();
return Task.FromResult(TrueValues.Contains(value));
}
}
...并使用以下命令在 Global.asax.cs 中注册:
var pb = GlobalConfiguration.Configuration.ParameterBindingRules;
pb.Add(typeof(bool), p => new BooleanNumericParameterBinding(p));
和
var pb = GlobalConfiguration.Configuration.ParameterBindingRules;
pb.Insert(0, typeof(bool), p => new BooleanNumericParameterBinding(p));
这些都没有奏效。我的自定义HttpParameterBinding
未被调用,我仍然将值1
翻译为false
。
如何配置WebAPI以接受布尔值的1
值为true
?
编辑:我提供的示例是有意简化的。我的应用程序中有很多输入模型,它们包含许多布尔字段,我希望以上述方式处理它们。如果只有这一个领域,我就不会采用这种复杂的机制。
答案 0 :(得分:4)
看起来用FromUriAttribute
装饰参数只是完全跳过参数绑定规则。我做了一个简单的测试,用简单的SampleInput
替换bool
输入参数:
public string Get([FromUri] bool IsAwesome)
{
//do stuff with the input...
return "ok";
}
并且在调用IsAwesome
时仍未调用布尔规则(null
将作为&isAwesome=1
。
只要删除FromUri属性:
public string Get(bool IsAwesome)
{
//do stuff with the input...
return "ok";
}
调用规则并正确绑定参数。 FromUriAttribute类是密封的,所以我认为你已经搞砸了 - 好吧,你总是可以重新实现它并包含你的备用布尔绑定逻辑^ _ ^。