4

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; }
    }
}
4

2 に答える 2

1

簡単に言えば、Web Api の Model Binder を使用することはできません。MVC と Web Api は異なるモデル バインダーを使用し、Web Api モデル バインダーは単純型でのみ機能します。

可能な解決策と同様にさらに説明するリンクについては、この回答を参照してください。

より長い答え、System.Web.Http.ModelBinding.IModelBinder のカスタム実装を作成し、アクションの署名を次のように変更します。

public Response Create([ModelBinder(CustomModelBinder)]BatchCreateRequest request)
于 2014-08-21T19:38:13.140 に答える