强类型的 ODataActionParameters 可能吗?

Strongly typed ODataActionParameters possible?

鉴于以下 OData 自定义操作。是否可以对操作参数进行更重构友好的绑定?

两个魔术字符串必须完全相同:.Parameter<int>("Rating")(int)parameters["Rating"]。这肯定会在未来的某个时候崩溃。

配置

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");

// New code:
builder.Namespace = "ProductService";
builder.EntityType<Product>()
    .Action("Rate")
    .Parameter<int>("Rating");

控制器

[HttpPost]
public async Task<IHttpActionResult> Rate([FromODataUri] int key, ODataActionParameters parameters)
{
    if (!ModelState.IsValid)
    {
        return BadRequest();
    }

    int rating = (int)parameters["Rating"];
    db.Ratings.Add(new ProductRating
    {
        ProductID = key,
        Rating = rating
    });

    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateException e)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return StatusCode(HttpStatusCode.NoContent);
}

请求

POST http://localhost/Products(1)/ProductService.Rate HTTP/1.1
Content-Type: application/json
Content-Length: 12

{"Rating":5}

我尝试将参数直接放在方法中。但是我无法让它工作。

public async Task<IHttpActionResult> Rate([FromODataUri] int key, int rate)

根据 How to pass an objet as a parameter to an OData Action using ASP.NET Web Api? 看来可以使用 Object 但我只有原始类型作为参数。

请指教:)

我认为你在谈论这个问题https://github.com/OData/WebApi/issues/777

当只有一个操作参数时,ODataActionParameters 会使事情变得复杂,我们将在中断更改 6.0 版本后尝试为此设计一种解决方法或设计。