9

特定の基本クラスから派生したすべての投稿済みアイテムをコントローラー メソッドで処理することは可能ですか? アイデアは、コマンドをエンドポイントに投稿することでコマンドをディスパッチできるようにすることです。以下を試してみると、Post メソッドの「cmd」パラメーターは常に null です。

//the model:
public abstract class Command{
    public int CommandId{get; set;}
}
public class CommandA:Command{
    public string StringParam{get; set;}
}
public class CommandB:Command{
    public DateTime DateParam{get; set;}
}

//and in the controller:
    public HttpResponseMessage Post([FromBody]Command cmd)
    {
        //cmd parameter is always null when I Post a CommandA or CommandB
        //it works if I have separate Post methods for each Command type
        if (ModelState.IsValid)
        {
            if (cmd is CommandA)
            {
                var cmdA = (CommandA)cmd; 
                // do whatever
            }
            if (cmd is CommandB)
            {
                var cmdB = (CommandB)cmd;
                //do whatever
            }

            //placeholder return stuff
            var response = Request.CreateResponse(HttpStatusCode.Created);
            var relativePath = "/api/ToDo/" + cmd.TestId.ToString();
            response.Headers.Location = new Uri(Request.RequestUri, relativePath);
            return response;
        }
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }

繰り返しますが、このアプローチを試みると Post メソッドが呼び出されますが、パラメーターはフレームワークから常に null です。ただし、特定の CommandA パラメータ タイプを持つ Post メソッドに置き換えると、機能します。

私が試みていることは可能ですか?または、メッセージの種類ごとに、コントローラーで個別のハンドラー メソッドが必要ですか?

4

1 に答える 1

2

Json 形式でデータを送信する場合は、次のブログで、json.net で階層の逆シリアル化を実現する方法について詳しく説明しています。

http://dotnetbyexample.blogspot.com/2012/02/json-deserialization-with-jsonnet-class.html

于 2012-09-03T19:13:23.233 に答える