ApiController を使用して、複雑なオブジェクトを非シーケンシャル リストにモデル バインドしようとしています。リスト以外のすべてのフィールドは正しく設定されていますが、リストには 1 つの要素が含まれており (2 つのリスト要素がポストされていても)、その要素は null です。まったく同じコードを取得し、アクション メソッドで同じパラメーター タイプを使用して MVC コントローラーをポイントすると、すべてが期待どおりに機能します。
非シーケンシャル リストを使用しているため、Phil Haack ( http://haacked.com/archive/2008/10/23/model-binding-to-a- list.aspx )
「.Index」入力を削除し、リストを 0 から始まるシーケンシャル リストとして送信すると、ApiController もリストを正しくバインドします。ユーザーによって削除されたので、非順次リストを使用したいのです。)
ここで説明されているように、Web API コントローラーが MVC コントローラーとは異なる方法でパラメーター バインディングを行うことは理解していますが、非順次リストは Web API コントローラーで正しくバインドする必要があるようです。何か不足していますか?同じコードが Web API コントローラーではなく MVC コントローラーで機能するのはなぜですか? 非順次リストを Web API で正しくバインドするにはどうすればよいですか?
ここに私の投稿パラメータがあります:
Parameters application/x-www-form-urlencoded
BatchProductLots.Index 1
BatchProductLots.Index 2
BatchProductLots[1].BrandId 1
BatchProductLots[1].ContainerId 9
BatchProductLots[1].ContainerLot 123
BatchProductLots[1].PackageId 2
BatchProductLots[1].PlannedQuantity 0
BatchProductLots[1].ProducedQuantity 20
BatchProductLots[2].BrandId 1
BatchProductLots[2].ContainerId 9
BatchProductLots[2].ContainerLot 123
BatchProductLots[2].PackageId 1
BatchProductLots[2].PlannedQuantity 0
BatchProductLots[2].ProducedQuantity 1
BatchStatusId 1
LotNumber 070313
ProductionDate 07/03/2013
RecipeId 1
RecipeQuantity 1
SauceId 22
X-Requested-With XMLHttpRequest
これが私の Web API コントローラー アクションです。
(request.BatchProductLots リストは 1 つの要素に設定され (2 つの要素が投稿されたにもかかわらず)、その 1 つの要素は null です)
public Response Create(BatchCreateRequest request)
{
Response response = new Response();
try
{
Batch batch = Mapper.Map<Batch>(request);
batchService.Save(batch);
response.Success = true;
}
catch (Exception ex)
{
response.Message = ex.Message;
response.Success = false;
}
return response;
}
バインドしようとしているリストを持つ複雑なオブジェクトは次のとおりです。
public class BatchCreateRequest
{
public int BatchStatusId { get; set; }
public DateTime ProductionDate { get; set; }
public string LotNumber { get; set; }
public int SauceId { get; set; }
public int RecipeId { get; set; }
public int RecipeQuantity { get; set; }
public List<BatchProductLot> BatchProductLots { get; set; }
public class BatchProductLot
{
public int BrandId { get; set; }
public int ContainerId { get; set; }
public string ContainerLot { get; set; }
public int PackageId { get; set; }
public int PlannedQuantity { get; set; }
public int ProducedQuantity { get; set; }
}
}