2013-02-20 5 views
7

मैं jQuery 1.9.1 और MVC का उपयोग कर रहा 4.डी-serializing अशक्त में MVC4 कार्रवाई परिणामों में वस्तु को महत्व देता

मैं निम्नलिखित जावास्क्रिप्ट है:

$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: JSON.stringify({ devices: [{ Id: 123, Name: "something", MapName: "map" },{ Id: 321, Name: "a name", MapName: "another map" }] }), 
    dataType: 'json', 
    contentType: 'application/json' 
} 

और निम्नलिखित सी # मेरी HomeController में:

[HttpPost] 
public string doSomething(Device[ ] devices) 
{ 
    //stuff consuming that array 
} 

डिवाइस वर्ग इस तरह परिभाषित किया गया है:

[Serializable] 
public class Device 
{ 
    public long Id; 
    public string Name; 
    public string MapName; 
} 

डीबगर के अनुसार, डिवाइस सरणी एक 2-तत्व सरणी है जिसमें प्रत्येक डिवाइस तत्व के सभी गुण शून्य होते हैं।

क्रोम के अनुसार, पोस्ट डेटा इस तरह दिखता है:

{ 
    "devices": [ 
     { 
      "Id": 123, 
      "Name": "something", 
      "MapName": "map" 
     }, 
     { 
      "Id": 321, 
      "Name": "a name", 
      "MapName": "another map" 
     } 
    ] 
} 

यहाँ क्या गलत है MVC बना रही है नीचे है कि उन वस्तुओं अशक्त हैं अप कसम और, फिर भी अभी भी मुझे का एक उपयुक्त-लंबाई सरणी दे उन्हें?

मैंने JSON.stringify पर कॉल किए बिना सीधे सरणी पोस्ट करने का प्रयास किया है। मैंने किसी ऑब्जेक्ट के अंदर सरणी को "डिवाइस" नामक संपत्ति के रूप में पोस्ट करने का प्रयास किया है, फिर इसे बिना छेड़छाड़ किए। मैंने किसी ऑब्जेक्ट के अंदर सरणी को "डिवाइस" नामक संपत्ति के रूप में पोस्ट करने का प्रयास किया है, जबकि केवल सरणी को स्ट्रिंग कर रहा है।

इन सभी परिणामों में एक रूप या किसी अन्य के बुरे व्यवहार में परिणाम होता है। या तो क्रोम उपयुक्त डेटा को पहले स्थान पर पोस्ट नहीं करता है, या एमवीसी इसे डी-सीरियलाइज नहीं करता है।

मैंने वेब को खराब कर दिया है और ऐसा क्यों नहीं लगता है कि इसे क्यों तोड़ा जाना चाहिए।

संपादित 2013-02-21 13:12 UTC-5:

मैं भी JSON का उपयोग कर और बस jQuery प्रपत्र डेटा के रूप में पोस्ट दे बिना इस कोशिश की है। यहाँ उस के लिए कोड है:

var postData = { devices: [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }] }; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: postData 
}); 

और सी # अभी भी ऊपर के समान है।

व्यवहार अभी भी वही है जब यह JSON था, हालांकि। एमवीसी 2 तत्वों की एक सरणी देखता है, लेकिन उस सरणी में ऑब्जेक्ट्स के सभी मान डिफ़ॉल्ट हैं (स्ट्रिंग के लिए पूर्णांक और शून्य के लिए 0)।

+0

इसके लायक होने के लिए, यह भी विफल रहता है जब मैं इसे JSON के रूप में पोस्ट नहीं करता हूं। मैं JSON का उपयोग करके इस से विवाहित नहीं हूं, लेकिन मुझे पोस्ट डेटा/किसी भी तरह/deserialize करने के लिए एमवीसी की जरूरत है। – dodexahedron

उत्तर

3

स्ट्रिंग को अंतिम रूप देने की आवश्यकता है ...

var postData = { devices: JSON.stringify([{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]) }; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    dataType: 'json', 
    data: postData 
    } 

तो मैं बना नियंत्रक कार्रवाई "उपकरण" और डी नामक केवल एक स्ट्रिंग ले:

पहले, मैं एक संपत्ति "उपकरणों" कहा जाता है कि stringified सरणी शामिल हैं के साथ वस्तु बनाने के लिए जावास्क्रिप्ट बदल मैन्युअल JSON.Net का उपयोग कर इसे -serialized:

[HttpPost] 
public string MakeMmLinks(string devices) 
{ 
    List<Device> devicesList = JsonConvert.DeserializeObject<List<Device>>(devices); 
    ... 
} 

यह ठीक काम किया, लेकिन क्या मुझे परेशान है कि वस्तु de-क्रमबद्धता कुछ है कि MVC देशी रूप संभालती माना जाता है है।

अगर किसी के पास क्या हुआ है या मैंने क्या किया है, इस पर कोई अंतर्दृष्टि है, तो मुझे यह सुनना अच्छा लगेगा।

+0

कोई अंतर्दृष्टि नहीं, लेकिन धन्यवाद, मैंने एक ही समस्या पर अपने सिर को खरोंच करने में उम्र बिताई। –

0

आप ऑब्जेक्ट पोस्ट कर रहे हैं जिसमें 2 डिवाइसों की एक सरणी है। यदि आप निम्न कोशिश करने के बजाय, डिवाइस सरणी पोस्ट करना चाहते हैं।

var devices = [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: JSON.stringify(devices), 
    dataType: 'json', 
    contentType: 'application/json' 
}); 
+0

जिस तरह से मैं मूल रूप से ऐसा कर रहा था, और इसका परिणाम उसी व्यवहार में होता है। एमवीसी सरणी प्राप्त करता है, जानता है कि इसमें कितने तत्व हैं, और तत्वों के सभी गुणों को शून्य में सेट करते हैं। – dodexahedron

+2

आप अपने नियंत्रक को स्ट्रिंग क्यों पोस्ट करते हैं? पोस्ट जेएस खुद ऑब्जेक्ट। –

+0

सरणी पोस्ट करने से भी खराब व्यवहार होता है। जब मैं सीधे सरणी पोस्ट करता हूं तो क्रोम पोस्ट डेटा के रूप में "अपरिभाषित = और अपरिभाषित =" भेजता है। – dodexahedron

1

इस तरह के मामलों में मुझे tradition: true बहुत महत्वपूर्ण है। सुनिश्चित नहीं है कि आपको

dataType: 'json', 
traditional: true 
संबंधित मुद्दे