web-dev-qa-db-ja.com

POST JSON with MVC 4 API Controller

私はこのコードを持っています:

   $.ajax({


        type: "POST",
        url: "/api/slide",
        cache: false,
        contentType: "application/json; charset=utf-8",
        data: '{"Title":"fghfdhgfdgfd"}',
        dataType: "json",

これは私のコントローラーです:

public class SlideController : ApiController
{

    // POST /api/Slide
    public void Post(string Title)
    {
    }

コードを実行して/ api/Slideを呼び出すと、[タイトル]にデータがなくnullになります。

JSONをAPIコントローラーに投稿するにはどうすればよいですか?

POST http://127.0.0.2:81/api/slide HTTP/1.1
Host: 127.0.0.2:81
Connection: keep-alive
Content-Length: 18
Origin: http://127.0.0.2:81
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://127.0.0.2:81/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Title=fghfdhgfdgfd
17
user1615362

ビューモデルを定義します。

public class SlideViewModel
{
    public string Title { get; set; }
}

次に、コントローラーアクションでこのビューモデルを引数として使用します。

public class SlideController : ApiController
{
    // POST /api/Slide
    public void Post(SlideViewModel model)
    {
        ...
    }
}

最後にアクションを呼び出します:

$.ajax({
    type: 'POST',
    url: '/api/slide',
    cache: false,
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ title: "fghfdhgfdgfd" }),
    success: function() {
        ...    
    }
});

その理由は、文字列などの単純な型がURIからバインドされるためです。また、Web APIでのモデルバインディングについて 次の記事 もお読みください。

21
Darin Dimitrov

変換先のオブジェクトにデフォルトの(空の)コンストラクターがあることを確認してください。

経験則:オブジェクトに逆シリアル化する場合は、オブジェクトを簡単に作成できるようにする必要があります。これらのガイドラインは役立ちます:

  • 周りに渡されるすべてのプロパティパブリックである必要があります

  • オブジェクトはパラメータなしで作成されるである必要があります。

このJSON文字列/オブジェクトの例:

{ Name: "John Doe", Phone: "123-456-7890", Pets: [ "dog", "cat", "snake" ] }

次のクラスのオブジェクトに変換できます。

 public class Person {

     public string Name { get; set; }
     public string Phone { get; set; }
     public string[] Pets { get; set; }

  }

またはこれ:

public class Person {

   public string Name { get; set; }
   public string Phone { get; set; }
   public string[] Pets { get; set; }
   public Person() {}
   public Person(string name, string phone) {
      Name = name;
      Phone = phone;
   }

}

またはこれ:

public class Person {

    public string Name { get; set; }
    public string Phone { get; set; }
    public string[] Pets { get; set; }
    public Person() {}


 }

これは違います

public class Person {

    public string Name { get; set; }
    public string Phone { get; set; }
    public string[] Pets { get; set; }
    public Person(string name, string phone) {
      Name = name;
      Phone = phone;
    }

}

ASP.NET MVC 4に残りを任せましょう

public class PersonController : ApiController
{
        // .. other actions 
        public HttpResponseMessage PostPerson(Person person)
        {
            if ( null != person)
                // CELEBRATE by doing something with your object
            else 
                // BE SAD and throw and exception or pass an error message

        }
        // .. other actions 
}

クラスにデフォルトのコンストラクタがない場合、またはクラスのソースコードにアクセスできない場合は、次のようなアダプタクラスを作成できます。

  • デフォルトのコンストラクタがあります
  • 公開する必要があるプロパティを公開します

上記のPersonクラスをデフォルトのコンストラクタなしで使用すると、アダプタは次のようになります。

public class PersonAdapter {

    public Person personAdaptee;

    public string Name {
        get { return personAdaptee.Name; }
        set { personAdaptee.Name = value }
    }

    public string Phone {
        get { return personModel.Phone; }
        set { personModel.Phone = value; }
    }

    public string[] Pets {
        get { return personAdaptee.Pets; }
        set {personAdaptee.Pets = value }
    }

    public PersonAdapter() {

        personAdaptee = new Person("", "", null);

    }

}

ASP.NET MVC 4に残りを任せましょう

public class PersonController : ApiController
{
        // .. other actions 
        public HttpResponseMessage PostPerson(PersonAdapter person)
        {
            if ( null != person)
                // CELEBRATE by doing something with your object
            else 
                // BE SAD and throw and exception or pass an error message

        }
        // .. other actions 
}
10
Isioma Nnodum

これを試して:

$.ajax({
    type: "POST",
    url: "/api/slide",
    data: { Title: "fghfdhgfdgfd" }
});

これを引き起こしているのは、データ属性を囲む引用符です。

つまり、データ:{タイトル: "fghfdhgfdgfd"}
not >> data: '{Title: "fghfdhgfdgfd"}'

更新:
また、あなたのコントローラーは少し奇妙に見えますが、ルーティングなどを見ないと分からないです。

私はこのような何かを見ることを期待します:

public class SlideController : ApiController
{
    public HttpResponseMessage PostSlide(string Title)
    {
        // Do your insert slide stuff here....

        string uri = Url.Link("DefaultApi", new { id = item.Id });
        response.Headers.Location = new Uri(uri);
        return response;
    }
}

明らかに、jQueryのURLも更新する必要があります。

ここを見てください:

http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

別の更新:

通常、Jsonと一致するCLRオブジェクトを作成し、MVCモデルバインダーを使用してそれに直接バインドします。それをしたくない場合は、オブジェクトにバインドして、辞書に逆シリアル化できます。

// POST api/values
public void Post(object json)
{
    Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json.ToString());
    var x = values["Title"];
}
2
Steve Lydford

アクションパラメータをFromBodyにキャストします。

public class SlideController : ApiController
{

    // POST /api/Slide
    public void Post([FromBody]string Title)
    {
    }
}
1
Bilal Saeed
$.ajax({
    type: 'POST',
    url: '/api/slide',
    cache: false,
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ title: "fghfdhgfdgfd" }),
    success: function() {
        ...    
    }
});

コントローラは

public class SlideController : ApiController
{

    // POST /api/Slide
    public void Post(string Title)
    {
    }

URLが無効です。URLはSlideコントローラーのアクションPostに対応している必要があります

uRLをurl: "~/ControllerName/ActionName"に編集してください。このコンテキストではUrl:"~/Slide/Post"である必要があります

0
Ghebrehiywet