如何让WebAPI在不使用C#属性的情况下接受一个复杂对象作为DELETE HTTP谓词的参数

How do I get WebAPI to accept a complex object as its argument for a DELETE HTTP verb without using C# attributes?

本文关键字:一个 复杂 对象 谓词 参数 HTTP DELETE WebAPI 情况下 属性      更新时间:2023-09-26

我在服务器上使用C#/WebAPI,在客户端上使用AngularJS。

给定一个类似WebAPI控制器上的public void Delete(MyClass m)的方法和一个由值对象组成的类MyClass,我如何使用$http格式化HTTP DELETE请求而不在C#中指定属性(即[FromUri]

这就是为什么我使用分层对象而不是ID:

我正在开发一个插件系统,我试图让消耗程序员在学习时间、写作时间和代码长度方面尽可能简单。

插件系统将允许CRUD访问EF对象。在服务器上,当我想成为时,我会让他们实现一个接口

public interface IMyInterface<TEntity>
{
    IEnumerable<TEntity> Get();
    void Put(TEntity t);
    void Post(TEntity t);
    void Delete(TEntity t);
}

我现在正在客户端上处理Delete,由于某种原因,在[FromUri]这样的具体实现中,如果没有C#属性,就无法映射复杂的对象。据我所知,属性不是从接口继承的,因此,如果我的客户端(AngularJS)执行类似$http.delete('api/uri', { params: { objectToDelete } });的操作,则需要一个属性来使用params进行删除。我还尝试过使用配置对象的data属性,但也没有成功。我知道用ID作为Delete方法的参数是传统的/标准的,但如果这里存在这样的东西,那么客户端需要知道什么构成了"密钥"——这更需要消耗程序员来编写。

MyClass是一个复杂类型,通过ASP.NET Web API从请求主体绑定。HTTP语义不允许为DELETE提供请求体,因此,您将无法使用Angular发布带有DELETE的请求体。确切地说,这不是Angular的问题,但大多数浏览器不会发送带有AJAX DELETE请求的正文。