ttu*_*tes 8 odata asp.net-core
我有2个POCO,课程和特征与int PKs.我设置了导航属性,以便我可以成功地$expand这样:
http://localhost:54321/odata/Lessons?$expand=Traitshttp://localhost:54321/odata/Traits?$expand=Lessons我将从Net 461迁移到.Net Core 2的最后一个障碍是创建关系.
具体来说,当我尝试调用以下方法时,通过以下请求,我得到一个404.
[AcceptVerbs("POST", "PUT")]
public async Task<IActionResult> CreateRef(
[FromODataUri] int key, string navigationProperty, [FromBody] Uri link)
{
.... Do Work
}
Run Code Online (Sandbox Code Playgroud)
邮差要求:
http://localhost:54321/odata/Lessons(1)/Traits/$ref
Run Code Online (Sandbox Code Playgroud)
身体:
{
"@odata.id":"http://localhost:54321/OData/traits(1)"
}
Run Code Online (Sandbox Code Playgroud)
以下是我的Startup.Configure方法.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
var builder = ConfigureOdataBuilder(app);
app.UseMvc(routeBuilder =>
{
routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
routeBuilder.MapODataServiceRoute("ODataRoute", "odata", builder.GetEdmModel());
// Work-around for #1175
routeBuilder.EnableDependencyInjection();
routeBuilder.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // enable mvc controllers
});
}
private ODataConventionModelBuilder ConfigureOdataBuilder(IApplicationBuilder app)
{
var builder = new ODataConventionModelBuilder(app.ApplicationServices);
builder.EntitySet<Lessons>(nameof(Lessons));
builder.EntitySet<Traits>(nameof(Traits));
return builder;
}
Run Code Online (Sandbox Code Playgroud)
问题:如何使用此控制器方法?
我尝试过的事情,
[ODataRoute("Lessons({key})/{navigationProperty}")]虽然走了很长的路,但我终于找到了答案。
\n\n[ODataRoute("lessons({lessonId})/traits({traitId})/$ref")]\npublic IActionResult CreateRef([FromODataUri] int lessonId, [FromODataUri] int traitId)\n{\n //do work\n}\nRun Code Online (Sandbox Code Playgroud)\n\n重要提示:您必须像我一样调用 id-params。不要\xc2\xb4t 只称它们为 Id - 否则你\xc2\xb4 会得到 404。
\n\n还有一件事...
\n\n对于那些尝试从 microsoft 文档中获取方法的人 - Api 名称已更改。您不需要\xc2\xb4t 来完成此任务,但如果您必须将 Uri 转换为 OData 路径,这里有一个 Uri 扩展为你做这件事:
\n\npublic static Microsoft.AspNet.OData.Routing.ODataPath CreateODataPath(this Uri uri, HttpRequest request)\n{\n var pathHandler = request.GetPathHandler();\n var serviceRoot = request.GetUrlHelper().CreateODataLink(\n request.ODataFeature().RouteName, \n pathHandler, \n new List<ODataPathSegment>());\n\n return pathHandler.Parse(serviceRoot, uri.LocalPath, request.GetRequestContainer());\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您有这样的 Uri:http://localhost:54321/OData/traits(1)您可以将其拆分为 OData 段以获取导航:returnedPath.NavigationSource或指定的键:returnedPath.Segments.OfType<KeySegment>().FirstOrDefault().Keys.FirstOrDefault().Value
| 归档时间: |
|
| 查看次数: |
341 次 |
| 最近记录: |