c#-无法使附加到实体的ODATA v4操作正常工作

因此,我尝试按照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.

上一篇:OData debug - Java client - why my batch request fails


下一篇:java-OData v3和OData v4之间的区别