web-dev-qa-db-ja.com

jQueryがJSONではなくnullをASP.NET Web APIに投稿する

これを機能させることができないようです...クライアントに次のようなjQueryがあります。

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    data: JSON.stringify({ "report":reportpath }),
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});

そして、私のWeb.APIコントローラーには、次のようなメソッドがあります。

[HttpPost]
public bool ReportExists( [FromBody]string report )
{
    bool exists = File.Exists(report);
    return exists;
}

サーバーにファイルが存在するかどうかを確認し、存在するかどうかについてブール値を返すだけです。私が送信するレポート文字列はUNCパスなので、reportpathは '\\ some\path \'のようになります。

スクリプトを正常に起動して、ReportExistsメソッドのブレークポイントにヒットできますが、レポート変数は常にnullです。

何が悪いのですか?

.postとpostJSONを使用して投稿する方法も確認しました。多分私はそれらの1つを使うべきですか?もしそうなら、私のフォーマットは何ですか?

pdate:追加の手がかりかも-[FromBody]を削除すると、ブレークポイントがまったくヒットしない-「リクエストに一致するhttpリソースが見つかりませんでした」私が見ている例[FromBody]が必要ないことを示しています...?

16
Nicros

だから私は問題と解決策を見つけました。だから、まず最初に。 contentTypeを 'application/json'にすることはできません。空白にする必要があります(デフォルトはapplication/x-www-form-urlencodedだと思います)。 jsonを送信する必要があるようですが、名前と値のペアに名前がありません。 JSON.stringifyの使用もこれを台無しにします。したがって、完全に機能するjQueryコードは次のようになります。

$.ajax({
    type: "POST",
    url: "api/slideid/reportexists",
    data: { "": reportpath },
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});

Web.API側では、パラメーターに[FromBody]属性が必要ですが、これ以外はかなり標準的です。 (私にとって)本当の問題は投稿でした。

Fiddlerでは、リクエストの本文は「=%5C%5Croot%5Cdata%5Creport.html」のようになりました。

This 投稿には本当に答えがあり、リンクも this 記事にリンクされていて、これも非常に役に立ちました。

25
Nicros

jQuery.ajax()は、デフォルトでcontentTypeをapplication/x-www-form-urlencodedに設定します。代わりにapplication/jsonでリクエストを送信できます。また、データを文字列として送信する必要があります。これにより、postメソッドのreportパラメータにモデルがバインドされます。

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    contentType:  "application/json",
    data: JSON.stringify(reportpath),
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});
13
Maggie Ying

これは私にとってはうまくいきましたが、他のすべてのアプローチではうまくいきませんでした:

function addProduct() {
        var product = { 'Id': 12, 'Name': 'Maya', 'Category': 'newcat', 'Price': 1234 };             
        $.ajax({
            type: "POST",
            url: "../api/products",
            async: true,
            cache: false,
            type: 'POST',
            data: product,
            dataType: "json",
             success: function (result) {

            },
            error: function (jqXHR, exception) {
                alert(exception);
            }
        });
    }

サーバ側:

 [HttpPost]
    public Product[] AddNewProduct([FromBody]Product prod)
    {
        new List<Product>(products).Add(prod);
        return products;
    }
6
user3596399

MVCのFromBody属性を使用している場合、MVCバインダーはこれをオプションのパラメーターとして扱います。つまり、単一のFromBodyパラメータしか取得していなくても、パラメータ名についてexplicitである必要があります。

次のような簡単なもので作業できるはずです。

コントローラ:

[HttpPost]
public bool ReportExists( [FromBody]string report )
{
    bool exists = File.Exists(report);
    return exists;
}

Javascript

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    data: { "report":reportpath },
    success: function(exists) {
    ...

jQueryのデータオブジェクトがコントローラーのパラメーター名と一致していることを確認する必要がありますexactly

0
abbottdev

$ .postは私に目的を果たしました。 [FromBody]をWeb APIから削除し、jqueryクライアントの$ .postのurlパラメーターにURLを指定します。出来た!

0
Pratik Patel