【问题标题】:Can't get ODATA v4 actions attached to an entity to work无法使附加到实体的 ODATA v4 操作起作用
【发布时间】: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


    【解决方案1】:

    仅供参考bound to entityset examples,从中可以看出您需要一个命名空间,您应该请求如下:odata/Job(key)/Default.Pause,绑定操作不需要 ODataRoute。

    【讨论】:

    • 经过努力,这似乎确实是问题所在。我的后续问题是,命名空间有什么意义?据我所知,它似乎没有任何用处,只是让我的生活变得困难。
    • 然后我将更改添加到 ExtensionlessUrlHandler 以识别句点,它破坏了我的 Angularjs 网站。
    • 发现我需要更改名称才能被接受。多么痛苦。
    【解决方案2】:

    我也在苦苦挣扎……

    我尝试应用范欧阳的建议,但没有成功……

    http://odata.github.io/WebApi/#04-07-action-parameter-support

    OData 路由配置:

    EntityTypeConfiguration<tblMeetings> MeetingsType = builder.EntitySet<tblMeetings>("Meetings").EntityType;
    MeetingsType.HasKey(p => p.Meeting_ID);
    
    var MeetingsFunctionBadges = MeetingsType.Collection.Function("Badges");
    MeetingsFunctionBadges.Parameter<int>("key");
    MeetingsFunctionBadges.Returns<List<tblBadges>>();
    

    会议负责人:

    [HttpGet]
    [ODataRoute("Meetings({key})/Badges")]
    public IHttpActionResult GetBadges(ODataActionParameters parameters)
    {
        return Ok();
    }
    

    然后是错误...

    “System.InvalidOperationException”类型的异常发生在 System.Web.OData.dll 但未在用户代码中处理

    附加信息:路径模板 'Meetings({key})/Badges' on 控制器“Meetings_OData”中的操作“GetBadges”无效 OData 路径模板。在 OData 路径模板 'Meetings({key})/Badges'。

    【讨论】:

    • 尝试 [ODataRoute("Meetings({key})/Default.Badges")] 默认前缀似乎允许 OData v4 解析路径段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多