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);
});
Bekerja dengan POST di webapi bisa rumit! Ingin menambahkan ke jawaban yang sudah benar ..
Akan fokus secara khusus pada POST karena berurusan dengan GET itu sepele. Saya tidak berpikir banyak orang akan mencari-cari penyelesaian masalah dengan GET dengan webapis. Bagaimanapun ..
Jika pertanyaan Anda adalah - Di MVC Web Api, bagaimana caranya - - Menggunakan nama metode tindakan khusus selain kata kerja HTTP umum? - Lakukan beberapa posting? - Posting beberapa tipe sederhana? - Posting jenis yang rumit via jQuery?
Maka solusi berikut dapat membantu:
Pertama, untuk menggunakan Metode Tindakan Kustom di API Web, tambahkan rute api web sebagai:
Dan kemudian Anda dapat membuat metode tindakan seperti:
Sekarang, jalankan jQuery berikut dari konsol browser Anda
Kedua, untuk melakukan banyak posting , itu sederhana, buat beberapa metode aksi dan hiasi dengan attrib [HttpPost]. Gunakan [ActionName ("MyAction")] untuk menetapkan nama kustom, dll. Akan datang ke jQuery di titik keempat di bawah
Ketiga, Pertama-tama, memposting beberapa jenis SIMPLE dalam satu tindakan tidak dimungkinkan. Selain itu, ada format khusus untuk memposting bahkan tipe tunggal tunggal (selain melewati parameter dalam string kueri atau gaya REST). Ini adalah titik yang membuat saya membenturkan kepala saya dengan Klien Istirahat (seperti Fiddler dan ekstensi klien Lanjutan REST Chrome) dan berburu di sekitar web selama hampir 5 jam ketika akhirnya, URL berikut terbukti membantu. Akan mengutip konten yang relevan untuk tautan itu bisa mati!
PS: Memerhatikan sintaksis yang aneh ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
Bagaimanapun, mari kita selesaikan cerita itu. Bergerak:
Keempat, memposting tipe kompleks melalui jQuery, ofcourse, $ .ajax () akan segera muncul di peran:
Katakanlah metode tindakan menerima objek Orang yang memiliki id dan nama. Jadi, dari javascript:
Dan aksinya akan terlihat seperti:
Semua hal di atas, bekerja untuk saya !! Bersulang!
sumber
Saya baru saja bermain dengan ini dan menemukan hasil yang agak aneh. Katakanlah Anda memiliki properti publik di kelas Anda di C # seperti ini:
maka Anda harus melakukan trik JSON.stringify seperti yang disarankan oleh Shyju dan menyebutnya seperti ini:
Namun, jika Anda mendefinisikan getter dan setter di kelas Anda seperti ini:
maka Anda dapat menyebutnya lebih sederhana:
Ini menggunakan header HTTP:
Saya tidak begitu yakin apa yang terjadi di sini tetapi sepertinya ada bug (fitur?) Dalam framework. Mungkin metode pengikatan yang berbeda memanggil "adapter" yang berbeda, dan sementara adaptor untuk aplikasi / json bekerja dengan properti publik, yang untuk data yang dikodekan dalam formulir tidak.
Saya tidak tahu mana yang akan dianggap praktik terbaik.
sumber
Gunakan JSON.stringify () untuk mendapatkan string dalam format JSON, pastikan bahwa ketika membuat panggilan AJAX Anda melewati atribut yang disebutkan di bawah ini:
Di bawah ini adalah kode berikan jquery untuk melakukan panggilan posting ajax ke api web asp.net:
sumber
Pastikan bahwa layanan WebAPI Anda mengharapkan objek yang diketik dengan struktur yang cocok dengan JSON yang Anda lewati. Dan pastikan Anda meregangkan JSON yang Anda POSTing.
Ini JavaScript saya (menggunakan AngluarJS):
Dan inilah Pengontrol WebAPI saya:
sumber
Kode berikut untuk mengembalikan data dalam format json, bukan xml -Web API 2: -
Letakkan baris berikut di file Global.asax
sumber
sumber
Microsoft memberikan contoh yang baik untuk melakukan ini:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Pertama validasikan permintaan
dan daripada menggunakan data serial.
Di sini 'Status' adalah bidang dalam tipe kompleks. Serialisasi dilakukan oleh .NET, tidak perlu khawatir tentang itu.
sumber
1) Di sisi klien Anda, Anda dapat mengirimkan permintaan http.post dalam string seperti di bawah ini
2) Kemudian di pengontrol api web Anda, Anda dapat membatalkan deserialisasi
3) Kelas ApiReceivedListOfObjects Anda harus seperti di bawah ini
4) pastikan bahwa string serial Anda (IndexInfo di sini) menjadi seperti di bawah struktur sebelum perintah JsonConvert.DeserializeObject pada langkah 2
sumber