can';调用具有基类型参数的.NET Core Web API控制器时,将派生类作为angular代码的参数进行post

can';调用具有基类型参数的.NET Core Web API控制器时,将派生类作为angular代码的参数进行post,.net,angular,asp.net-web-api,.net-core,.net,Angular,Asp.net Web Api,.net Core,我的Web API方法需要一个属性为BaseObj的SomeObject参数。客户端需要传入一个对象(SomeObject),该对象具有派生类型的属性(DerivedObj) 我通过角度服务发送物体 // web api side // The base and derived types public class BaseObj { public virtual string Text { get; set; } } public class DerivedObj: BaseObj { pu

我的Web API方法需要一个属性为
BaseObj
SomeObject
参数。客户端需要传入一个对象(
SomeObject
),该对象具有派生类型的属性(
DerivedObj

我通过角度服务发送物体

// web api side
// The base and derived types
public class BaseObj { public virtual string Text { get; set; } }
public class DerivedObj: BaseObj  { public override string Text { get; set; } }
public class SomeObject{
public BaseObj prop{get;set;}
}

// The API controller

public class TestApiController : ApiController
{
[HttpPost("ObjInsert")]
public void ObjInsert(SomeObject someObj)
{ } 
}


//Angular side I have models with same hierarchy

save() { 
    this.someService.objInsert(this.someObject).subscribe
      (
         //some code
      );
  } 
问题是API方法接收的obj参数属性的类型确实是
BaseObj
,而不是
DerivedObj

发送保存请求时,派生对象在角度侧可见。

问题在于您已将
SomeObject
定义为具有类型为
BaseObj
的属性。因此,当框架获取HTTP请求的JSON时,它对派生类一无所知,也不希望知道。您已经定义了一个使用
BaseObj
类型的类,因此它将在C#端进行反序列化

我认为你的C端类之间的差异是某种行为方面的。您有两个选择来处理此问题:

  • 在C#端使用分部类,并用您需要的行为扩展它们
  • 使用扩展方法将行为添加到非多态基类

  • 最好的做法是定义直接的数据传输类来处理API中的数据移动。这意味着您的类应该没有行为和任何类型的继承结构。所有数据传输对象都应该是独立的,并且其结构的一部分不依赖于其他类。一开始这可能会让你发疯,但当你从开发过渡到维护时,你会很感激的。

    展示一些代码。一般来说,你不想在参数中使用基类/派生类或任何类型的类层次结构。我建议重新设计以在API中使用POCOs。