17

これを機能させることができないようです...クライアントに次のような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つを使うべきですか?もしそうなら、私のフォーマットは何でしょうか?

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

4

5 に答える 5

26

だから私は問題と解決策を見つけました。だから、まず最初に。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」のようになりました。

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

于 2013-02-11T20:25:40.287 に答える
13

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

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    contentType:  "application/json",
    data: JSON.stringify(reportpath),
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});
于 2013-02-08T19:55:37.540 に答える
6

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

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;
    }
于 2014-06-27T13:01:37.877 に答える
0

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

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

コントローラ:

[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のデータオブジェクトがコントローラーのパラメーター名と正確に一致することを確認する必要があります。

于 2014-12-16T16:02:24.643 に答える
-1

$.postは私にとって目的を果たしました。webapiから[FromBody]を削除し、jqueryクライアントの$.postのurlパラメーターにurlを指定します。機能した!

于 2014-09-10T07:09:18.397 に答える