Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.NETWebAPI2:如何获取数据绑定以在控制器方法中使用正确的数据类型?_C#_Asp.net Web Api2 - Fatal编程技术网

C# Asp.NETWebAPI2:如何获取数据绑定以在控制器方法中使用正确的数据类型?

C# Asp.NETWebAPI2:如何获取数据绑定以在控制器方法中使用正确的数据类型?,c#,asp.net-web-api2,C#,Asp.net Web Api2,简而言之,我有两个类和两个派生类。派生类有一个隐藏父类的集合。即使控制器方法具有参数的父数据类型,Web API 2也会为参数创建一个派生数据类型,并将客户端发送的Items放入隐藏的Items集合中 我如何正确地编写代码以发送看起来像派生类但作为父类数据类型访问的数据,或者我是否错误地使用了new关键字?父类表示数据库表。派生类填充有关购物车中产品的支持数据。我想我可以创建两种不同的控制器方法并重载它们,但我仍然对如何正确地实现这一点感到好奇 我有以下课程: ShoppingListVM {

简而言之,我有两个类和两个派生类。派生类有一个隐藏父类的集合。即使控制器方法具有参数的父数据类型,Web API 2也会为参数创建一个派生数据类型,并将客户端发送的
Items
放入隐藏的
Items
集合中

我如何正确地编写代码以发送看起来像派生类但作为父类数据类型访问的数据,或者我是否错误地使用了
new
关键字?父类表示数据库表。派生类填充有关购物车中产品的支持数据。我想我可以创建两种不同的控制器方法并重载它们,但我仍然对如何正确地实现这一点感到好奇

我有以下课程:

ShoppingListVM {
    public int Id {get;set;}
    public ICollection<ShoppingListItemVM> Items {get;set;}
}
ShoppingListItemVM {
    public int Id {get;set;}
}

我发送的数据包含
shoppinglistedvm
字段和
项目
字段
shoppinglistedvm
。控制器参数
ShoppingListVM shoppingList
正确显示数据,嵌套的
项目除外,该参数为空。调试器显示两个
数组,其中填充了
ShoppingListItemExpandedVM
数据类型,并且
ShoppingListItemVM
数据类型为空。

“即使控制器方法具有参数的父数据类型,Web API 2也会为参数创建派生数据类型。”我有点困惑,因为这是不可能的/至少我不能用我当地的例子做到这一点。你们有定制的模型活页夹吗?还是自定义JSON序列化程序?@weichch-Nope,没什么特别的。事实上,我们一个月前刚刚在VS 2017中创建了该项目。在调试器中,可以看到数据类型是派生类型。我也不认为这是可能的。@weichch我最终不得不创建两个带有重载签名的控制器方法。很高兴看到您解决了这个问题。我仍然不知道在没有模型绑定器的情况下,派生模型是如何创建的。控制器只会创建您告诉它期望的对象,并尝试从请求数据填充属性。它不会四处寻找其他类,这些类可能有也可能没有包含在主体中的其他属性。但是从另一个角度来看,如果类的扩展版本只包含额外的字段,那么您可以合并它们,或者在您的方法上总是期望扩展版本。如果请求不包含扩展属性,它们就不会被设置。”即使控制器方法具有参数的父数据类型,Web API 2也会为参数创建一个派生数据类型“我有点困惑,因为这是不可能的/至少我不能用我的本地示例做到这一点。你们有定制的模型活页夹吗?还是自定义JSON序列化程序?@weichch-Nope,没什么特别的。事实上,我们一个月前刚刚在VS 2017中创建了该项目。在调试器中,可以看到数据类型是派生类型。我也不认为这是可能的。@weichch我最终不得不创建两个带有重载签名的控制器方法。很高兴看到您解决了这个问题。我仍然不知道在没有模型绑定器的情况下,派生模型是如何创建的。控制器只会创建您告诉它期望的对象,并尝试从请求数据填充属性。它不会四处寻找其他类,这些类可能有也可能没有包含在主体中的其他属性。但是从另一个角度来看,如果类的扩展版本只包含额外的字段,那么您可以合并它们,或者在您的方法上总是期望扩展版本。如果请求不包含扩展属性,它们就不会被设置。
ShoppingListExpandedVM : ShoppingListVM {
    new public ICollection<ShoppingListItemExpanded> Items {get;set;}
}
ShoppingListItemExpandedVM : ShoppingListItemVM {
    public string Name {get;set;}  // Additional fields beyond ShoppingListItemVM above
}
public ShoppingListExpandedVM ShoppingListSave([FromBody] ShoppingListVM shoppingList) {
    var myShoppingList = ShoppingListVM.Map( shoppingList);
    _shoppingListService.Save( myShoppingList);
    _db.SaveChanges();
}