2012-03-20 2 views
6

मैं अपने सरणी इसलिए की तरह ले लिया है:जावास्क्रिप्ट से सी # में इंक की पास सूची - मुझे सूची मिलती है, लेकिन यह खाली है; फॉर्म डेटा ठीक से संरचित नहीं है?

updateLabels: function() { 
    var diagrams = _stage.diagramLayer.getChildren(); 

    var componentIDs = new Array(); 

    for (var index = 0; index < diagrams.length; index++) { 
     componentIDs.push(diagrams[index].componentID); 
    } 

    var self = this; 
    $.ajax({ 
     url: '../PlanView/UpdateDiagrams', 
     type: 'POST', 
     data: { ComponentIDs: JSON.stringify(componentIDs), RackInfo: $('#RackInfoSelect').val() }, 
     success: function (data) { 
      console.log('success'); 
     }, 
     error: function() { 
      console.log("error"); 
     } 
    }); 
    }, 

सर्वर साइड मैं इस विधि है:

ComponentIDs:[74,445,732,351,348,347,1123,599,600,1053,350,601,602,603,332,99,877,919,349,348,347,347,349,348] 
RackInfo:Equipment Weight 

मैं:

[CompressionFilterAttribute] 
public JsonResult UpdateDiagrams(List<int> componentIDs, string rackInfo) 
{ 
    List<object> diagramInformation = new List<object>(componentIDs.Count()); 
} 

अपने डेटा के रूप में यह नेटवर्क पर भेजी जा रही है सफलतापूर्वक RackInfo प्राप्त करें, अगर मैं List<string> की अपेक्षा करने के लिए UpdateDiagrams को बदलता हूं तो मुझे इसमें एक आइटम, संपूर्ण कंपोनेंट आईडी स्ट्रिंग के साथ एक सूची मिलती है।

मैं गलत तरीके से क्या कर रहा हूं?

संपादित करें: मैं एमवीसी 3 के तहत काम कर रहा हूं। मेरे नियंत्रक को पास करते समय मुझे कुछ प्रकार के स्वचालित deserialization का लाभ उठाने में सक्षम होना चाहिए, मुझे यकीन नहीं है कि कैसे।

समाधान: समाधान JSON.stringify में, केवल घटक आईडी में, मेरी डेटा ऑब्जेक्ट को लपेटना था। भले ही मैं इसे JSON में परिवर्तित किए बिना RackInfo चर सर्वर-साइड प्राप्त कर सकूं।

+0

हो सकता है कि 'componentIDs.push (parseInt (चित्र [सूचकांक] .componentID)); '? – MiMo

उत्तर

4

यदि आप अपने पोस्ट किए गए डेटा को JSON प्रारूप में रखना चाहते हैं तो इस तरह कुछ प्रयास करें। एमवीसी तब सर्वर-साइड पर स्वचालित रूप से deserialise करने में सक्षम होना चाहिए।

$.ajax({ 
    url: '../PlanView/UpdateDiagrams', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({ 
     componentIDs: componentIDs, 
     rackInfo: $('#RackInfoSelect').val() 
    }), 
    success: function (data) { 
     console.log('success'); 
    }, 
    error: function() { 
     console.log("error"); 
    } 
}); 

(मैं इस समय यह परीक्षण करने के लिए असमर्थ हूँ, लेकिन यह उम्मीद है कि सही तर्ज पर होना चाहिए, भले ही वह पूरी तरह से बग-मुक्त नहीं है।)

+0

यह सीधे एक चैंप की तरह बॉक्स से बाहर काम किया। मुझे आश्चर्य है कि मुझे हमेशा JSON.stringify को कॉल करने की आवश्यकता क्यों नहीं है। –

+0

यह कोड तब टूट जाएगा जब किसी int के अलावा किसी अन्य चीज को स्ट्रिंग में स्ट्रिंग में जोड़ा जाता है। आपको अपने सभी इनपुट को सैनिटाइज करना चाहिए और स्वचालित रूप से स्वचालित प्रक्रियाओं पर भरोसा करने के बजाय अपने मूल्यों को इनट्स पर पार्स करना चाहिए, जो विफल होने पर असफल हो जाते हैं। और, यह आपके ऐप को भी कम सुरक्षित बनाता है। कोड की एक पंक्ति से बचने के लिए यह सब? गुणवत्ता के लिए कोड! – frenchie

1

आप एक स्ट्रिंग भेज रहे हैं जिसमें स्ट्रिंग्स की एक सूची है। जब यह सर्वर पर जाता है, स्ट्रिंग को deserialized की जरूरत है।

[CompressionFilterAttribute] 
public JsonResult UpdateDiagrams(string ListcomponentIDs, string rackInfo) 
{ 
    List<int> componentIDs = (from string s in ListcomponentIDs.Split(',') 
          select Convert.ToInt32(s)).ToList<int>(); 
} 

मैंने पैरामीटर को एक स्ट्रिंग में बदल दिया। जब आपके पास int की सूची के रूप में था, तो यह एक खाली सूची थी क्योंकि आप इनट्स की सूची नहीं पारित कर रहे थे।

इसके अलावा, जे एस में, आप सरणी क्रमानुसार करने सिर्फ उस पर ToString फोन की जरूरत नहीं है,:

data: { ComponentIDs: componentIDs.toString() ... 

तो डेटा कोष्ठक [] शामिल नहीं है कि।

मुझे बताएं कि यह कैसे काम करता है।

+0

मैं इनट्स की एक सूची कैसे पास कर सकता हूं जिसे तत्काल/deserialized करने की आवश्यकता नहीं होगी, तो? मुझे पता है कि यह किया जा सकता है - मैंने इसे इट्स की तुलना में अधिक जटिल वस्तुओं के साथ किए जाने के उदाहरण देखे हैं। –

+0

जेसन का पूरा बिंदु डेटा को क्रमबद्ध/deserialize करने के लिए है। ऊपर देखें, मैंने कोड को थोड़ा सा सरल बना दिया। – frenchie

+0

और मैं जो कह रहा हूं वह यह है कि एमवीसी मेरे लिए ऐसा करना चाहता है। इसे देखें: http://uliasz.com/2010/07/passing-list-as-parameter-from-ajax-request-to-mvc-controller/ –

0

मैं एएसपी.नेट एमवीसी के साथ इसका परीक्षण करने में सक्षम नहीं हूं, लेकिन यदि आप JSON को हटाते हैं तो सबकुछ सही ढंग से काम करना चाहिए।

  • ComponentIDs []:: 10
  • ComponentIDs []: 20
  • ComponentIDs []: 30
  • RackInfo: उपकरण भार

यह JSON.stringify बिना फॉर्म डेटा है यह सामान्य तरीका है कि सरणी सर्वर पर पोस्ट की जाती है।

JSON.stringify साथ

:

  • ComponentIDs: [10,20,30]
  • RackInfo: Rackinfo

JSON.stringify करने के लिए कॉल करने के लिए स्ट्रिंग सरणी में कनवर्ट करता है "[ 10, 20, 30] "तो आप नियंत्रक को एक स्ट्रिंग पोस्ट कर रहे हैं।

संबंधित मुद्दे