我将 ASP.NET Web API 与 OData 一起使用。我正在尝试发布一个与父级有关系的子实体(父级已经存在)。当我发布实体(使用 WCF 数据服务客户端和 SetLink)时,我可以通过 Fiddler 看到它正在将 a 添加到请求的正文中。这个完全相同的请求适用于我们的 WCF 数据服务版本的服务(我们正在迁移到 Web API)。但是,这似乎没有将任何内容转换为 Web API 中控制器上的 Post 方法。<link...href=[address of parent]>
将孩子发布到 ChildController 时,如何从ChildController上的 Post 操作访问父 ID ?我知道请求中有值,但我怎样才能获得这个值?没有父级就无法创建子级。我需要修改控制器动作签名吗?也许我可以在某处使用某些属性?从 API 的角度来看,如果可能的话,我想避免将 ParentId 直接添加到子实体中。
public class ChildController
{
public HttpActionResult Post([FromBody]Child child)
{
//child.Parent is null here, but all other
//properties of Child are populated.
//How can I get the Parent's ID from the POST request??
}
}
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public Parent Parent { get; set; }
}
public class Parent
{
public int Id { get; set; }
public IEnumerable<Children> Children { get; set; }
}
编辑:这是我的要求。我更改了一些名称以保护无辜者(替换主机名和带有父/子的实体名称):
POST https://localhost/MyWebService/Child HTTP/1.1
Content-Type: application/atom+xml
DataServiceVersion: 1.0;NetFx
MaxDataServiceVersion: 3.0;NetFx
Accept: application/atom+xml,application/xml
Accept-Charset: UTF-8
User-Agent: Microsoft ADO.NET Data Services
Host: localhost
Content-Length: 1048
Expect: 100-continue
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<category term="MyWebService.Entities.Child" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Parent" type="application/atom+xml;type=entry" title="Parent" href="https://localhost/MyWebService/Parents(1L)" />
<id />
<title /><updated>2014-05-30T16:07:28Z</updated><author><name /></author>
<content type="application/xml">
<m:properties>
<d:Content>content</d:Content>
<d:CreatedDate m:type="Edm.DateTime">0001-01-01T00:00:00</d:CreatedDate>
<d:Description>desc</d:Description>
<d:Enabled m:type="Edm.Boolean">true</d:Enabled>
<d:Id m:type="Edm.Int64">0</d:Id><d:TabName>tname</d:TabName>
</m:properties>
</content>
</entry>