首页 > 解决方案 > 在调用具有基本类型参​​数的 .NET Core Web API 控制器时,无法将派生类作为参数从角度代码发布

问题描述

我的 Web API 方法需要一个 SomeObject具有属性的 a 参数BaseObj。客户端应该传入一个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. 发送保存请求时,派生对象在角度侧可见。

标签: .netangularasp.net-web-api.net-core

解决方案


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

我假设您在 C# 方面的类之间的区别是某种行为方面。你有几个选择来处理这个问题:

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

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


推荐阅读