EDIT : 31/10/2017
समान कोड / अप्रोच Asp.Net Core 2.0 के लिए भी काम करेगा । मुख्य अंतर यह है कि, asp.net कोर में, वेब एपीआई नियंत्रक और Mvc नियंत्रक दोनों को एकल नियंत्रक मॉडल में एक साथ विलय कर दिया जाता है। अपनी वापसी प्रकार हो सकता है तो IActionResult
यह के कार्यान्वयन में से एक या (उदाहरण: OkObjectResult
)
उपयोग
contentType:"application/json"
JSON.stringify
जब आप इसे भेजते हैं तो आपको इसे JSON स्ट्रिंग में बदलने के लिए विधि का उपयोग करने की आवश्यकता होती है,
और मॉडल बाइंडर आपके क्लास ऑब्जेक्ट पर जोंस डेटा को बांध देगा।
नीचे दिया गया कोड ठीक काम करेगा (परीक्षण किया गया)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
परिणाम
contentType
संपत्ति सर्वर को बताती है कि हम JSON प्रारूप में डेटा भेज रहे हैं। चूंकि हमने JSON डेटा संरचना भेजी थी, इसलिए मॉडल बाइंडिंग ठीक से होगी।
यदि आप ajax अनुरोध के हेडर का निरीक्षण करते हैं, तो आप देख सकते हैं कि Content-Type
मान के रूप में सेट किया गया है application/json
।
यदि आप सामग्री प्रकार स्पष्ट रूप से निर्दिष्ट नहीं करते हैं, तो यह डिफ़ॉल्ट सामग्री प्रकार का उपयोग करेगा जो है application/x-www-form-urlencoded;
टिप्पणियों में उठाए गए अन्य संभावित मुद्दों को संबोधित करने के लिए नवंबर 2015 पर संपादित करें
एक जटिल वस्तु पोस्ट करना
मान लीजिए कि आपके पास आपके वेब एपी एक्शन मेथड पैरामीटर जैसा एक जटिल दृश्य मॉडल वर्ग है
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;}
}
और आपका वेब एपीआई अंत बिंदु जैसा है
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;
}
}
इस लेखन के समय, ASP.NET MVC 6 नवीनतम स्थिर संस्करण है और MVC6 में, वेब एपीआई नियंत्रक और MVC नियंत्रक दोनों Microsoft.AspNet.Mvc.Controller
आधार वर्ग से विरासत में मिले हैं ।
क्लाइंट की ओर से विधि को डेटा भेजने के लिए, नीचे दिए गए कोड को ठीक काम करना चाहिए
//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 :)
});
मॉडल बंधन कुछ गुणों के लिए काम करता है, लेकिन सभी नहीं! क्यों ?
यदि आप [FromBody]
विशेषता के साथ वेब एपीआई विधि पैरामीटर को नहीं सजाते हैं
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
और ContentType संपत्ति मान निर्दिष्ट किए बिना मॉडल (कच्ची जावास्क्रिप्ट ऑब्जेक्ट, JSON प्रारूप में नहीं) भेजें
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
मॉडल बाइंडिंग मॉडल पर फ्लैट गुणों के लिए काम करेगा, न कि उन गुणों पर जहाँ प्रकार जटिल है / अन्य प्रकार। हमारे मामले में, Id
और Name
गुण पैरामीटर के लिए ठीक से बाध्य होंगे m
, लेकिन Tags
संपत्ति एक खाली सूची होगी।
यदि आप लघु संस्करण का उपयोग कर रहे हैं तो वही समस्या होगी, $.post
जो अनुरोध भेजते समय डिफ़ॉल्ट सामग्री-प्रकार का उपयोग करेगा।
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});