我有这样的想法(这个动作本身可能还可以)
[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上的信息。
答案 0 :(得分:5)
@NicoJuicy
您的代码:
builder.EntityType<ProductVariant>().Collection.Function("GenerateFromProduct")...
用于定义绑定功能。绑定函数类似于实例调用的实例方法。
类似地,ODataRoute
中的Uri模板应该与绑定函数uri相同。所以,它应该是:
[ODataRoute("ProductVariants/YourNameSpace.GenerateFromProduct(product={product}")]
此外,功能仅用于 GET 场景,因此,[HttpPost]
对于功能不正确。
也许以下材料可以帮助您理解OData中的功能/操作:
以下材料可以帮助您理解功能/动作参数:
以下材料可以帮助您了解属性路由: