自定义布尔参数绑定

时间:2014-10-14 09:09:39

标签: c# model-binding asp.net-web-api2

我有一个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

编辑:我提供的示例是有意简化的。我的应用程序中有很多输入模型,它们包含许多布尔字段,我希望以上述方式处理它们。如果只有这一个领域,我就不会采用这种复杂的机制。

1 个答案:

答案 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类是密封的,所以我认为你已经搞砸了 - 好吧,你总是可以重新实现它并包含你的备用布尔绑定逻辑^ _ ^。