如何使用ASP.NET Web Api将objet作为参数传递给OData Action?

时间:2013-10-31 16:44:58

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

如何将对象(实体)传递给OData Action?我可以传递简单类型和ComplexType,但如果尝试传递EntityType,我会得到:

Invalid parameter type 'apitest.Models.Product'. 
A non-binding parameter type must be either Primitive, Complex, 
Collection of Primitive or a Collection of Complex.

编辑:

var modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Product>("Products");
modelBuilder.EntitySet<PurchaseOrder>("PurchaseOrders");

var addProduct = modelBuilder.Entity<PurchaseOrder>().Action("AddProduct");
addProduct.Parameter<Product>("product");
addProduct.ReturnsFromEntitySet<PurchaseOrder>("PurchaseOrders");

我已尝试将addProduct.Parameter<Product>("product");替换为:

var productConfig = modelBuilder.StructuralTypes.OfType<EntityTypeConfiguration>().Single(x => x.Name == "Product");
addProduct.SetBindingParameter("product", productConfig, false);

但我无法找到有关如何使用SetBindingParameter的任何文档。如果我将Product注册为ComplexType,则第一个代码示例有效,但之后我不允许将其注册为Entity。

2 个答案:

答案 0 :(得分:0)

您可以使用发布或执行操作。只需在控制器类中创建它:

public IHttpActionResult Put([FromODataUri] int key, Product product)
{
    ...
}

我在我的应用程序中遇到同样的问题,我决定创建非实体类型的DTO类。

答案 1 :(得分:0)

假设您将操作绑定到实体类型,则可以使用

builder.EntityType<company>().Action("SetCommunities").CollectionEntityParameter<community>("communities");
public async Task<IHttpActionResult> SetCommunities(Guid key, ODataActionParameters parameters)

在这种情况下被称为例如http://localhost:63358/odata/companies(451735ef-15f2-4a9f-b4b9-d50c6410bf7c)/Default.SetCommunities/