11

動的JSONオブジェクトをWebAPIコントローラーに渡して、タイプに応じて処理できるようにする必要があります。ここに表示されているJSON.NETの例を使用してみましたが、Fiddlerを使用すると、渡されたJObectが常にnullであることがわかります。

これは、Fiddlerに貼り付けられた例からの成果です。

POST http://localhost:9185/api/Auto/PostSavePage/  HTTP/1.1
User-Agent: Fiddler
Content-type: application/json
Host: localhost
Content-Length: 88

{AlbumName: "Dirty Deeds",Songs:[ { SongName: "Problem Child"},{ SongName:  
"Squealer"}]}

これが私の非常に単純なWebAPIコントローラーメソッドです。

 [HttpPost]
 public JObject PostSavePage(JObject jObject)
 {        
     dynamic testObject = jObject;         
     // other stuff here
 }

私はこれに不慣れで、この分野に関していくつか質問があります。

この特定の例で私は何か間違ったことをしていますか?

間違いなく、もっと重要なことに、動的JSONオブジェクト(JavaScript AJAX投稿から)を渡すためのより良い方法はありますか?

4

2 に答える 2

15

Perceptionのコメントによると、JSONは有効に見えません。JSONLintを実行すると、次のようになります。

Parse error on line 1:
{    AlbumName: "Dirty De
-----^
Expecting 'STRING', '}'

フィールド名の前後に「」を付けるように変更します。

{
    "AlbumName": "Dirty Deeds",
    "Songs": [
        {
            "SongName": "Problem Child"
        },
        {
            "SongName": "Squealer"
        }
    ]
}

また、JObjectをJTokenまたはDynamicオブジェクト(例:ここ)に交換してみましたか?

[HttpPost]
 public JObject PostSavePage(JToken testObject)
 {                
     // other stuff here
 }

また

 [HttpPost]
 public JObject PostSavePage(dynamic testObject)
 {                
     // other stuff here
 }
于 2012-12-28T17:37:15.240 に答える
4

ここで助けてくれたすべての人に感謝します。残念ながら、私は何が悪かったのかを突き止めることができませんでした。

プロジェクトを1つずつ新しいプロジェクトに移植しましたが、正常に機能します。

参考までに、RouteConfigクラスがあります。これは、現時点では非常に単純です。

public class RouteConfig
{       
    private static string ControllerAction = "ApiControllerAction";

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: ControllerAction,
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

APIへの呼び出しでJSON.Stringifyが使用されるようになりました。

$.ajax("http://localhost:54997/api/values/PostSavePage/", {
    data:  JSON.stringify(jObject),                               
    contentType: 'application/json',
    type: 'POST'
});

元のAPIアクションは機能します。

現時点ではこれで遊んでいるだけなので、コードは最適ではありませんが、他の誰かが同様の問題を抱えている場合に備えて、基本的な形で役立つかもしれないことに注意してください。

于 2013-01-02T16:18:02.963 に答える