AJAX/Jqueryおよびc#を使用してデータベースに書き込もうとしています。パラメーターをnullとして表示するC#コードに渡すたびに、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',
});
}
単純型の場合、サーバー側で:
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'
});
}
ASP.NET WebAPIを使用しており、URLからすべての単純型(int、bool、stringなど)とbodyからすべての複雑な型をバインドしていると思います。名前をFromBody
属性でマークした場合、URLマッピングの代わりに要求本文からバインドします。
ASP.NET WebAPIルーティングとパラメーターバインディングの詳細については、こちらをご覧ください。
このようなことを試して、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'
});
}
クラスを次のように作成する場合、データコントラクトの属性が不足している部分があります。
[DataContract]
public class RecipeInformation
{
[DataMember]
public string name { get; set; }
}
これらの属性はSystem.Runtime.Serializationにあり、Jsonパーサー(Json.NET)はそれらを使用してモデルのデシリアライズ(ヘルプ)を行います。
APIコントローラーでのバインドは少し奇妙な側面です。私は信じている:
public void Post([FromBody]RecipeInformation information)
と
var dataJSON = { name: "test" };
動作するはずです。フォームデータとして渡すだけで確実に動作します。
$( "#updateuser")。click(function(){
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');
}
})
})
Microsoft Docs 前述のJSコードを使用することで問題が見つかりました
_$.post('api/updates/simple', { "": $('#status1').val() });
_
私が逃したのは空のプロパティ名を追加することでしたので、OPが行う必要があるのは{"":data:JSON.stringify(dataJSON)},
の代わりにdata:JSON.stringify(dataJSON),
です