DÜZENLEME : 31/10/2017
Aynı kod / yaklaşım Asp.Net Core 2.0 için de geçerli olacaktır. En büyük fark, asp.net çekirdeğinde, hem web api denetleyicileri hem de Mvc denetleyicileri tek denetleyici modeliyle birleştirilir. Dönüş tipi olabilir Yani IActionResult
's uygulaması bir veya (Ex: OkObjectResult
)
kullanım
contentType:"application/json"
JSON.stringify
Gönderirken JSON dizesine dönüştürmek için yöntem kullanmanız gerekir,
Ve model bağlayıcı, json verilerini sınıf nesnenize bağlayacaktır.
Aşağıdaki kod iyi çalışır (test edilmiştir)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Sonuç
contentType
özelliği sunucuya verileri JSON biçiminde gönderdiğimizi bildirir. Bir JSON veri yapısı gönderdiğimizden, model bağlama düzgün bir şekilde gerçekleşecektir.
Ajax isteğinin üstbilgilerini incelerseniz, Content-Type
değerin olarak ayarlandığını görebilirsiniz application/json
.
ContentType'ı açıkça belirtmezseniz, varsayılan içerik türünü kullanır. application/x-www-form-urlencoded;
Yorumlarda dile getirilen diğer olası sorunları ele almak için Kasım 2015'te düzenleyin
Karmaşık bir nesne gönderme
Diyelim ki web api eylem yöntemi parametreniz gibi karmaşık bir görünüm model sınıfınız var.
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;}
}
ve web api uç noktanız
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;
}
}
Bu yazma sırasında, ASP.NET MVC 6 en son kararlı sürümdür ve MVC6'da, hem Web api denetleyicileri hem de MVC denetleyicileri Microsoft.AspNet.Mvc.Controller
temel sınıftan miras alır .
Yönteme istemci tarafından veri göndermek için aşağıdaki kodun iyi çalışması gerekir
//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 :)
});
Model bağlama bazı özellikler için çalışır, ancak hepsi için geçerli değildir! Neden ?
Web api yöntemi parametresini [FromBody]
öznitelikle süslemezseniz
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
Ve contentType özellik değerini belirtmeden modeli (JSON biçiminde değil ham javascript nesnesi) gönderin
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
Model bağlama, türün karmaşık olduğu özellikler / başka bir tür için değil, modeldeki düz özellikler için çalışır. Bizim durumumuzda Id
ve Name
özellikleri parametreye uygun şekilde bağlanacaktır m
, ancak Tags
özellik boş bir liste olacaktır.
$.post
İsteği gönderirken varsayılan İçerik Türü'nü kullanacak olan kısa sürümü kullanıyorsanız aynı sorun ortaya çıkar .
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});