1

我有这样的想法(对自己的行动可能还可以)

    [HttpPost]
    [ODataRoute("GenerateFromProduct")]
    public async Task<IHttpActionResult> GenerateFromProduct([FromBodyAttribute] Product product)
    {
        if(!ModelState.IsValid)
        {
            return BadRequest();
        }

        List<string[]> combos = new List<string[]>();
        List<ProductVariant> productVariants = product.GenerateProductVariants();
        db.ProductVariants.AddRange(productVariants);

        await db.SaveChangesAsync();

        return Ok(productVariants);
    }

WebApiConfig 中定义的操作可能是这样的:

 builder.EntityType<ProductVariant>().Collection
 .Function("GenerateFromProduct").Returns<List<ProductVariant>>().EntityParameter<Product>("product");

但我不断收到以下错误(经过多次重写)

An exception of type 'System.InvalidOperationException' occurred in System.Web.OData.dll but was not handled in user code

Additional information: The path template 'GenerateFromProduct' on the action 'GenerateFromProduct' in controller 'ProductVariants' is not a valid OData path template. Resource not found for the segment 

任何想法我做错了什么?我没有在网上找到很多关于 odata 和自定义功能/操作的信息,除了 msdn 上的信息。

4

1 回答 1

5

@NicoJuicy

你的代码:

builder.EntityType<ProductVariant>().Collection.Function("GenerateFromProduct")...

就是定义一个Bound函数。绑定函数类似于实例调用的实例方法。

类似地,Uri 模板中的ODataRoute应该与绑定函数 uri 相同。所以,它应该是:

 [ODataRoute("ProductVariants/YourNameSpace.GenerateFromProduct(product={product}")]

另外,function 只用在GET场景中,所以,[HttpPost]function 是不正确的。

也许以下材料可以帮助您理解 OData 中的功能/操作:

以下材料可以帮助您了解功能/动作参数:

以下材料可以帮助您理解属性路由:

于 2015-10-12T02:45:03.277 回答