【问题标题】:How to pass an objet as a parameter to an OData Action using ASP.NET Web Api?如何使用 ASP.NET Web Api 将对象作为参数传递给 OData 操作?
【发布时间】:2013-10-31 16:44:57
【问题描述】:

如何将对象(实体)传递给 OData 操作?我可以传递简单类型和 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&lt;Product&gt;("product"); 替换为:

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

但是我找不到任何关于如何使用 SetBindingParameter 的文档。如果我将 Product 注册为 ComplexType,则第一个代码示例可以工作,但是我不允许将其注册为 Entity。

【问题讨论】:

  • 您可以发布相关操作的代码吗? Product 实体是否有任何自定义属性?
  • 我添加了一些代码。 Product 上没有属性。
  • 您的 Web api 控制器操作的签名是什么? Web api 可能只是希望您的对象是第一个,但也许您首先有一些其他原始(或非对象)参数? This article 详细说明 web api 参数绑定,可能有助于跟踪问题。
  • 我已经尝试了各种签名组合与部分或全部这些参数:AddProduct([FromODataUri] int key, Product product, ODataActionParameters parameters)。如果我使用上面定义的 SetBindingParameter,我会收到以下错误:“此服务不支持 '~/entityset/key/unresolved' 形式的 OData 请求。”我读过那篇文章,但似乎还有其他事情发生,因为 OData 层处理参数的方式与原始 Web Api 不同。

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


【解决方案1】:

您可以使用 Post 或 Put 操作。只需在您的控制器类中创建它:

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

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

【讨论】:

    【解决方案2】:

    假设你将一个动作绑定到一个实体类型,这是可行的

    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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-07
      • 2019-05-19
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多