自定义Odata v4功能 - 不是有效的odata路由模板 - 未找到该段的资源

时间:2015-10-08 19:52:49

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

我有这样的想法(这个动作本身可能还可以)

    [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上的信息。

1 个答案:

答案 0 :(得分:5)

@NicoJuicy

您的代码:

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

用于定义绑定功能。绑定函数类似于实例调用的实例方法

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

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

此外,功能仅用于 GET 场景,因此,[HttpPost]对于功能不正确。

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

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

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