定义复杂数据传输对象的路由

时间:2015-08-17 16:27:25

标签: c# asp.net-web-api2 asp.net-web-api

能够如此定义路由:

@echo off 
cd /d "C:\Program Files\ImageMagick-6.9.1-Q16"
mogrify -path img/images img/images/*.* -fuzz 10% -fill pink -opaque  black img/images/*.*

非常适合调用这样的端点:

Route("Calculator/AddTwoNumbers/a/{a}/b/{a}")]
public IHttpActionResult AddTwoNumbers(double a, double b)

我很好奇在有效载荷/数据传输对象(DTO)变得更复杂(即分层)的情况下该怎么做。以上的例子,这可能是一个相应的DTO:

http://localhost:64466/Calculator/AddTwoNumbers/a/1/b/2

类似的东西:

public class PayLoad
{
    public double a { get; set; }
    public double b { get; set; }
}

不起作用,因为似乎没有'模型绑定' (?)和asp.net mvc一样。

如果DTO更复杂,我该怎么办?

2 个答案:

答案 0 :(得分:1)

您需要使用payLoad属性装饰[FromUri]参数定义:

public IHttpActionResult AddTwoNumbers([FromUri] PayLoad payLoad)

请参阅MSDN

答案 1 :(得分:1)

我认为有两种方法可以解决使用WepApi获取数据的问题:
1-使用 [FromUri] : 要强制Web API从URI读取复杂类型,请将[FromUri]属性添加到参数中。以下示例定义了GeoPoint类型,以及从URI获取GeoPoint的控制器方法。

public class GeoPoint
{
public double Latitude { get; set; } 
public double Longitude { get; set; }
}

public ValuesController : ApiController
{
public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}

客户端可以将纬度和经度值放在查询字符串中,Web API将使用它们构建GeoPoint。例如:

http://localhost/api/values/?Latitude=47.678558&Longitude=-122.130989

2-使用 [FromBody] : 要强制Web API从请求正文中读取简单类型,请将[FromBody]属性添加到参数中:

public HttpResponseMessage Post([FromBody] string name) { ... }

此代码在此解释:Parameter Binding in ASP.NET Web API