强类型的ODataActionParameters可能吗?

时间:2016-08-19 06:37:17

标签: asp.net asp.net-web-api odata asp.net-web-api-odata

鉴于以下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,但我只有一个基本类型作为参数。

请建议:)

1 个答案:

答案 0 :(得分:1)

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

当只有一个动作参数时,ODataActionParameters使事情变得复杂,我们将在破坏变更6.0版本后尝试为此设置解决方法或设计。