.net - 在调用具有基本类型参数的 .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
. 发送保存请求时,派生对象在角度侧可见。
解决方案
问题是您已定义SomeObject
为具有 type 的属性BaseObj
。因此,当框架获取 HTTP 请求的 JSON 时,它对您的派生类一无所知,也不希望如此。您已经定义了一个使用该BaseObj
类型的类,这就是它将在 C# 端反序列化的内容。
我假设您在 C# 方面的类之间的区别是某种行为方面。你有几个选择来处理这个问题:
- 在 C# 端使用部分类,并使用您需要的行为扩展它们。
- 使用扩展方法将行为添加到非多态基类。
最佳实践是定义直接数据传输类来处理 API 内的数据移动。这意味着您的类应该没有行为和任何类型的继承结构。所有数据传输对象都应该是独立的,并且其部分结构不依赖于其他类。起初这可能会让您发疯,但是当您从开发过渡到维护时,您会很感激它。
推荐阅读
- javascript - 无法在基于 Fuse 的文件系统上打开 MS Word、PDF
- javascript - 我如何在 FlatList React native 中使用 scrollToIndex?
- prolog - Prolog 程序通过 book_title、book_author、book_edition 使用递归搜索书籍
- presto - 从 Presto CLI 连接到 SQL Server 2019
- python - 将MongoDB中的所有文档从字符串修改为列表
- python - How to change opacity of a region in an RGB image (numpy, cv2)
- python - combining list of 10 dictionaries into one
- sql - Create Basic Android or iOS App to Connect to SQL Database Hosted via Web Services
- functional-programming - How to use handle control structures using fluture functional programming library
- python - 这看起来像是使用类的好方法吗?