odata动作接受列表参数始终为null

时间:2015-06-29 13:48:48

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

我有一个odata控制器的问题。

我希望发送一个Address-objects列表,但接收的参数始终为null。

我的终点如下:

    [EnableQuery]
    public IHttpActionResult SetCoordinatesOnAddressList(IEnumerable<Address> addresses)
    {
        var result = addresses.Select(address => _coordinates.GetAddressCoordinates(address)).ToList();
        return Ok(result);
    } 

我在WebApiConfig中设置了这个

builder.EntityType<Address>().Collection
            .Action("SetCoordinatesOnAddressList")
            .ReturnsFromEntitySet<Address>("Addresses");

我正在使用Postman发送请求。

我的请求是作为后请求发送的,如下所示:

[{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]

我有一个不同的端点,它接受一个Address而不是IEnumerable,并且使用相同的json-request(没有[]),因此json中的字段是正确的。

总结一下: 我的IEnumerable端点始终为null。 可能导致它的任何想法?

谢谢。

编辑:

我尝试更改我的终点以接受AddressDTO,如下所示:

public IHttpActionResult SetCoordinatesOnAddressList(AddressDTO addresses)
{
    return Ok(2);
}

这是一个AddressDTO:

public class AddressDTO
{
    public IEnumerable<Address> Addresses { get; set; }
}

如果我尝试发布此内容:

{"Addresses": [{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]}

我收到此错误:

{
  "error": {
    "code": "",
    "message": "The request entity's media type 'application/json' is not supported for this resource.",
    "innererror": {
      "message": "No MediaTypeFormatter is available to read an object of type 'AddressDTO' from content with media type 'application/json'.",
      "type": "System.Net.Http.UnsupportedMediaTypeException",
      "stacktrace": "   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\\\r\\\n   at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\\\r\\\n   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"
    }
  }
}

4 个答案:

答案 0 :(得分:3)

如果将集合作为名为address的属性发送到对象上,会发生什么?

{"addresses": [{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]}

答案 1 :(得分:3)

为了采取行动,为什么不使用ODataActionParameter作为控制器中方法的参数?

这是一个关于如何使用Action的简单教程:

http://odata.github.io/WebApi/#04-07-action-parameter-support

其中,部分&#34; 实体和实体集合参数&#34;是同一个场景,因为我看到你定义了&#34;地址&#34;作为实体类型。

  

builder.EntityType()......

然而,&#34; 复杂参数的复杂和集合&#34;是复杂类型的场景。

答案 2 :(得分:2)

[HttpPost]
[ODataRoute("SetCoordinatesOnAddressList")]
public IHttpActionResult SetCoordinatesOnAddressList(ODataActionParameters parameters)
{
    IEnumerable<Address> addresses =  parameters["addresses"] as IEnumerable<Address>;
    var result = addresses.Select(address => _coordinates.GetAddressCoordinates(address)).ToList();
    return Ok(result);
} 

WebAPIConfig应如下所示

builder.Action("SetCoordinatesOnAddressList").Returns<IHttpActionResult>().CollectionParameter<Address>("addresses");

它没有绑定到实体,因此像这样访问      本地主机/的OData / SetCoordinatesOnAddressList

答案 3 :(得分:1)

我无法使用Odata控制器工作,我不得不通过它,所以我最终做的是创建一个正常的API控制器,工作正常。

public IHttpActionResult SetCoordinatesOnAddressList(IEnumerable<Address> addresses)
{
    //Do stuff
}

这可以接受一个没有任何设置的地址IEnumerable,它只是起作用。