これを機能させることができないようです...クライアントに次のような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]が必要ないことを示しています...?
だから私は問題と解決策を見つけました。だから、まず最初に。 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」のようになりました。
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;
}
}
});
これは私にとってはうまくいきましたが、他のすべてのアプローチではうまくいきませんでした:
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;
}
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。
$ .postは私に目的を果たしました。 [FromBody]をWeb APIから削除し、jqueryクライアントの$ .postのurlパラメーターにURLを指定します。出来た!