25

AJAX / Jquery と c# を使用してデータベースに書き込もうとしています。パラメータを C# コードに渡すたびに、null として表示されます。コントローラー クラスの作成時に Visual Studio が生成する既定のテンプレートを使用しています。どんな助けでも大歓迎です!

注: これは私が電話しようとしている休息サービスです。(通常の ASP Web サイト... MVC ではありません。また、GET Rest API は完全に機能します。)

Jquery/AJAX:

var dataJSON = { "name": "test" }

$('#testPostMethod').bind("click", GeneralPost);
function GeneralPost() {
    $.ajax({
        type: 'POST',
        url: '../api/NewRecipe',
        data:JSON.stringify(dataJSON),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    });
}

C#

    //If I remove the [FromBody] Tag then when I click the button this method is never called.
    public void Post([FromBody]string name)

    {

    }

編集:

コードを少し調整しましたが、まだ同じ問題が発生しています。要約すると、POST メソッドをロードしていますが、null を渡しています。

C#

 public class RecipeInformation
    {
        public string name { get; set; }

    }

        public void Post(RecipeInformation information)

        {

        }

AJAX:

    var dataJSON = { information: { name: "test" } };

    $('#testPostMethod').bind("click", GeneralPost);
    console.log(dataJSON);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '../api/NewRecipe',
            data: dataJSON,
            contentType: 'application/json; charset=utf-8',
        });
    }
4

7 に答える 7

56

単純型の場合、サーバー側:

public void Post([FromBody]string name)
{
}

クライアント側では、json 形式で送信するかどうかを定義するだけです。

    var dataJSON = "test";

    $('#testPostMethod').bind("click", GeneralPost);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '/api/NewRecipe',
            data: JSON.stringify(dataJSON),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });
    }

複合型で機能させたい場合は、サーバー側から次のように定義する必要があります。

public class RecipeInformation
{
    public string name { get; set; }
}

public class ValuesController : ApiController
{
    public void Post(RecipeInformation information)
    {
    }
}

そしてクライアント側から:

    var dataJSON = { name: "test" };

    $('#testPostMethod').bind("click", GeneralPost);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '/api/NewRecipe',
            data: JSON.stringify(dataJSON),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });
    }
于 2013-03-29T09:13:46.920 に答える
2

このようなことを試して、jquery param メソッドを使用できます

    var postData = {
        name : 'name'
    }

    $('#testPostMethod').bind("click", GeneralPost);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '../api/NewRecipe',
            data: $.param(postData,true),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });
    }
于 2013-03-28T21:50:55.563 に答える
2

ASP.NET WebAPI を使用していて、URL からすべての単純型 (int、bool、string など) をバインドし、本文からすべての複合型をバインドしているとします。名前をFromBody属性でマークすると、URL マッピングの代わりにリクエスト本文からバインドされます。

ASP.NET WebAPI ルーティングとパラメーター バインドの詳細については、次を参照してください。

于 2013-03-28T18:17:36.093 に答える
1

不足している部分があります。データ コントラクト属性です。クラスを次のように作成した場合:

[DataContract]
public class RecipeInformation
{
    [DataMember]
    public string name { get; set; }
}

これらの属性は System.Runtime.Serialization にあり、Json パーサー (Json.NET) はそれらを使用してモデルを逆シリアル化 (支援) します。

于 2013-03-28T21:05:33.710 に答える
1

API コントローラーでのバインドは、少し奇妙な側面があります。私は信じている:

public void Post([FromBody]RecipeInformation information)

var dataJSON = { name: "test" };

動作するはずであり、フォームデータとして渡すだけで確実に動作します。

于 2013-03-28T22:26:02.397 に答える
0

$("#updateuser").click(関数 () {

        var id = $("#id").val();
        var dataJSON = $("#username").val();

        alert("" + dataJSON);

        $.ajax({


            url: 'http://localhost:44700/api/Home/' + id,
            type: 'PUT',
            data: JSON.stringify(dataJSON),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',

            success: function (data, textStatus, xhr) {
                $.each(data, function (key, val) {
                    $("<li>" + val + "</li>").appendTo($("#names"));
                })
            },
            error: function (xhr, textStatus, errorThrown) {
                alert('Error in Operation');
            }

            })

    })
于 2019-02-15T10:55:03.100 に答える