can';调用具有基类型参数的.NET Core Web API控制器时,将派生类作为angular代码的参数进行post
我的Web API方法需要一个属性为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
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端类之间的差异是某种行为方面的。您有两个选择来处理此问题:
最好的做法是定义直接的数据传输类来处理API中的数据移动。这意味着您的类应该没有行为和任何类型的继承结构。所有数据传输对象都应该是独立的,并且其结构的一部分不依赖于其他类。一开始这可能会让你发疯,但当你从开发过渡到维护时,你会很感激的。展示一些代码。一般来说,你不想在参数中使用基类/派生类或任何类型的类层次结构。我建议重新设计以在API中使用POCOs。