WebAPI:自定义参数映射

时间:2013-08-12 15:42:57

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

鉴于控制器:

public class MyController : ApiController
{
    public MyResponse Get([FromUri] MyRequest request)
    {
        // do stuff
    }
}

模特:

public class MyRequest
{
    public Coordinate Point { get; set; }
    // other properties
}

public class Coordinate
{
    public decimal X { get; set; }
    public decimal Y { get; set; }
}

API网址:

/api/my?Point=50.71,4.52

我希望类型Point的{​​{1}}属性在到达控制器之前从查询字符串值Coordinate转换。

我可以在哪里加入WebAPI以实现它?

1 个答案:

答案 0 :(得分:3)

我用模型绑定器做了类似的事情。 请参阅this article的选项#3。

您的模型绑定器将是这样的:

public class MyRequestModelBinder : IModelBinder {
    public bool BindModel(HttpActionContext actionContext,
                          ModelBindingContext bindingContext) {
        var key = "Point";
        var val = bindingContext.ValueProvider.GetValue(key);
        if (val != null) {
            var s = val.AttemptedValue as string;
            if (s != null) {
                var points = s.Split(',');
                bindingContext.Model = new Models.MyRequest {
                    Point = new Models.Coordinate {
                        X = Convert.ToDecimal(points[0],
                                              CultureInfo.InvariantCulture),
                        Y = Convert.ToDecimal(points[1],
                                              CultureInfo.InvariantCulture)
                    }
                };
                return true;
            }
        }
        return false;
    }
}

然后,您必须将其连接到动作中的模型绑定系统中:

public class MyController : ApiController
{
    // GET api/values
    public MyRequest Get([FromUri(BinderType=typeof(MyRequestModelBinder))] MyRequest request)
    {
        return request;
    }
}