EDIT : 31/10/2017
Kode / pendekatan yang sama juga akan bekerja untuk Asp.Net Core 2.0 . Perbedaan utama adalah, Pada inti asp.net, baik pengontrol api web dan pengontrol Mvc digabung bersama menjadi model pengontrol tunggal. Jadi jenis laba mungkin IActionResult
atau salah satu dari itu implementasi (Ex: OkObjectResult
)
Menggunakan
contentType:"application/json"
Anda perlu menggunakan JSON.stringify
metode untuk mengubahnya menjadi string JSON ketika Anda mengirimnya,
Dan pengikat model akan mengikat data json ke objek kelas Anda.
Kode di bawah ini akan berfungsi dengan baik (diuji)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Hasil
contentType
properti memberi tahu server bahwa kami mengirim data dalam format JSON. Karena kami mengirim struktur data JSON, pengikatan model akan terjadi dengan benar.
Jika Anda memeriksa tajuk permintaan ajax, Anda dapat melihat bahwa Content-Type
nilainya ditetapkan sebagai application/json
.
Jika Anda tidak menentukan tipe konten secara eksplisit, itu akan menggunakan tipe konten default yang application/x-www-form-urlencoded;
Edit pada November 2015 untuk mengatasi masalah lain yang mungkin muncul dalam komentar
Posting objek yang kompleks
Katakanlah Anda memiliki kelas model tampilan kompleks sebagai parameter metode aksi api web Anda seperti ini
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
dan titik api web Anda seperti
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
Pada saat penulisan ini, ASP.NET MVC 6 adalah versi stabil terbaru dan di MVC6, Baik pengendali api web dan pengendali MVC mewarisi dari Microsoft.AspNet.Mvc.Controller
kelas dasar.
Untuk mengirim data ke metode dari sisi klien, kode di bawah ini akan berfungsi dengan baik
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
Penjilidan model berfungsi untuk beberapa properti, tetapi tidak semua! Mengapa
Jika Anda tidak menghias parameter metode api web dengan [FromBody]
atribut
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
Dan mengirim model (objek javascript mentah, bukan dalam format JSON) tanpa menentukan nilai properti contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
Penjilidan model akan berfungsi untuk properti flat pada model, bukan properti di mana jenisnya kompleks / tipe lain. Dalam kasus kami, Id
dan Name
properti akan terikat dengan benar ke parameter m
, Tapi Tags
properti akan menjadi daftar kosong.
Masalah yang sama akan terjadi jika Anda menggunakan versi pendek, $.post
yang akan menggunakan Tipe Konten default saat mengirim permintaan.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});