C# ASP.NET Web API OData(v4)在具有空间属性的实体上发布

C# ASP.NET Web API OData(v4)在具有空间属性的实体上发布,c#,asp.net-web-api2,odata,asp.net-web-api-odata,C#,Asp.net Web Api2,Odata,Asp.net Web Api Odata,在ASP.NET Web API OData(v4)上发布具有空间属性的实体的正确方法是什么 GET上的序列化工作正常,但我在文章中尝试的所有操作都会导致模型变为null 支持POST吗 提前谢谢 public class PlacesController : ODataController { [HttpGet] [EnableQuery] public virtual async Task<IHttpActionResult> Get([FromOData

在ASP.NET Web API OData(v4)上发布具有空间属性的实体的正确方法是什么

GET上的序列化工作正常,但我在文章中尝试的所有操作都会导致模型变为null

支持POST吗

提前谢谢

public class PlacesController : ODataController
{
    [HttpGet]
    [EnableQuery]
    public virtual async Task<IHttpActionResult> Get([FromODataUri] string key)
    {
        var place = new Place()
        {
            Id = Guid.NewGuid().ToString(),
            Location = GeographyPoint.Create(1, 1)
        };

        return Ok(place);
    }

    [HttpPost]
    [EnableQuery]
    public virtual async Task<IHttpActionResult> Post(Place place)
    {
        if (place == null)
        {
            return BadRequest();
        }

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        return Created(place);
    }
}

    [DataContract]
public class Place
{
    [DataMember]
    public string Id
    {
        get;
        set;
    }

    [DataMember]
    public GeographyPoint Location
    {
        get;
        set;
    }
}

    public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        var edmBuilder = new ODataConventionModelBuilder();

        edmBuilder.EntitySet<Place>("Places");

        var model = edmBuilder.GetEdmModel();

        config.MapODataServiceRoute(routeName: "ODataRoute", routePrefix: "api", model: model);
    }
}
公共类PlacesController:ODataController
{
[HttpGet]
[启用查询]
公共虚拟异步任务Get([FromODataUri]字符串键)
{
变量位置=新位置()
{
Id=Guid.NewGuid().ToString(),
Location=GeographyPoint.Create(1,1)
};
返回Ok(地点);
}
[HttpPost]
[启用查询]
公共虚拟异步任务发布(地点)
{
if(place==null)
{
返回请求();
}
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
创建的返回(地点);
}
}
[数据合同]
公共课场所
{
[数据成员]
公共字符串Id
{
得到;
设置
}
[数据成员]
公共地理点位置
{
得到;
设置
}
}
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.maphttpAttribute路由();
var edmBuilder=新ODataConventionModelBuilder();
edmBuilder.EntitySet(“地点”);
var model=edmBuilder.GetEdmModel();
config.MapODataServiceRoute(routeName:“ODataRoute”,routePrefix:“api”,model:model);
}
}

在阅读了下面提到的文章之后,这似乎是可能的。您需要使用oDataActionParameters类型作为post的输入,稍后在方法中将其转换为所需类型。方法签名如下所示:

public async Task<IHttpActionResult> RateProduct(ODataActionParameters parameters)
公共异步任务速率产品(ODataActionParameters)

在阅读了下面提到的文章之后,请查看下面的示例并深入了解这篇文章,这似乎是可能的。您需要使用oDataActionParameters类型作为post的输入,稍后在方法中将其转换为所需类型。方法签名如下所示:

public async Task<IHttpActionResult> RateProduct(ODataActionParameters parameters)
公共异步任务速率产品(ODataActionParameters)

查看此示例并深入了解此

谢谢。当使用动作时,绑定对空间类型有效,并且空间类型是“第一级”参数。如果动作的参数是一个地点,而空间类型是该地点的一个属性,则它不起作用。对这种行为的解释是什么?序列化工作正常,而反序列化则不行。你提到的那篇文章没有直接涉及这一点。谢谢。当使用动作时,绑定对空间类型有效,并且空间类型是“第一级”参数。如果动作的参数是一个地点,而空间类型是该地点的一个属性,则它不起作用。对这种行为的解释是什么?序列化工作正常,而反序列化则不行。你提到的那篇文章没有直接涉及这一点。