因此,我尝试按照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来调用它.不幸的是,它无法识别“暂停”操作,而是将其与“ entityset / key / unresolved”操作的响应一起列出.如果我尝试在其上使用ODataRoute属性:
[ODataRoute("Job({key})/Pause")]
它使Pause暂停,给我一个编译错误“在控制器’Job’中的动作Pause上的路径模板’Job({key})/ Pause’不是有效的OData路径模板.找到了一个未解决的路径段’Pause在OData路径模板中.”
现在,如果我将其设为未绑定操作:
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,即使我没有任何参数来查看是否更改了任何内容.没有.
解决方法:
仅供参考bound to entityset examples,从中可以看到您需要一个名称空间,您应该像这样请求:odata / Job(key)/Default.Pause,绑定操作不需要ODataRoute.