【发布时间】:2016-08-29 17:36:09
【问题描述】:
因此,我尝试按照说明 here 对我的 Job 实体执行操作,但对于我来说,我无法让 OData 识别它。
动作非常简单。只是一个布尔值的切换:
[HttpPost]
public IHttpActionResult Pause([FromODataUri]int key)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
Job job = _context.Job.Find(key);
if (job == null)
{
return NotFound();
}
job.IsPaused = !job.IsPaused;
_context.SaveChanges();
return Ok(acquisition.IsPaused);
}
它在我的 WebApiConfig 中定义为:
var jobEntity = builder.EntityType<Job>();
var pause = jobEntity.Action("Pause");
pause.Returns<bool>();
所以,我应该能够发布到 //url/odata/Job(key)/Pause 来调用它。不幸的是,它无法识别 Pause 操作,将其与 entityset/key/unresolved 操作的响应一起列出。如果我尝试在其上使用 ODataRoute 属性:
[ODataRoute("Job({key})/Pause")]
它在暂停时窒息,给我一个编译错误“路径模板 'Job({key})/Pause' 在控制器 'Job' 中的操作 Pause 不是有效的 OData 路径模板。找到一个未解决的路径OData 路径模板中的段 'Pause'。"
现在,如果我让它成为一个未绑定的操作:
var pause = builder.Action("Pause");
pause = Parameter<int>("key");
pause.Returns<bool>();
和
[HttpPost]
[ODataRoute("Pause")]
public IHttpActionResult Pause(ODataActionParameters parameters)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
var key = Convert.ToInt32(parameters["key"]);
Job job = _context.Job.Find(key);
if (job == null)
{
return NotFound();
}
job.IsPaused = !job.IsPaused;
_context.SaveChanges();
return Ok(acquisition.IsPaused);
}
它工作得很好。那么,为什么我不能将它绑定到 Job 实体?正如一个注释,我确实尝试添加 ODataActionParameters,即使我没有任何参数来查看它是否改变了任何东西。没有。
【问题讨论】:
标签: c# asp.net-mvc asp.net-web-api2 odata