2012-03-19 8 views
8

एएसपी.नेट एमवीसी 3 प्राप्त करने में समस्याएं मेरे जटिल JSON ऑब्जेक्ट को बांधने के लिए एक सूची है।एमवीसी 3 कॉम्प्लेक्स जेएसओएन सूची बाध्यकारी

यहां मेरी वस्तुओं के लिए संरचना है।

public class PageModel 
{ 
    public PageModel() { } 
    public CustomObject1 CustomObject { get; set; } 
    public IEnumerable<CustomObject2> Objects { get; set; } 

} 

public class CustomObject1 
{ 
    public CustomObject1() { } 
    [Required] 
    public int CustomId1 { get; set; } 
    public string CustomName { get; set; } 
} 

public class CustomObject2 
{ 
    public CustomObject2() { } 
    [Required] 
    public int Custom2Id { get; set; } 
    public CustomObject3 SubItem { get; set; } 
    public int SubItemId { get; set; } 
} 

आप CustomObject3 मान सकते हैं समान संरचना की है - अभी तक एक और बना वर्ग नकल करने की कोई जरूरत नहीं है, इसलिए मैं समझ आप अपनी कल्पना :)

उपयोग कर सकते हैं यहाँ जावास्क्रिप्ट/jQuery पोस्ट कॉल बनाता है (मान सभी जे एस ऊपर यह सही डेटा प्रदान करता है के लिए अग्रणी):

//$obj1 has all data for the first object 
var firstObj = { }; 
firstObj.CustomId1 = $obj1.Id; 
firstObj.CustomName = $obj1.Name; 

var i = 0; 

//$objects is an array with all the data 
$.each($objects, function() { 
    objsArray[i] = { 
    Custom2Id: $(this).Id, 
    SubItemId: $(this).itemId 
    }; 

    ++i; 
}); 

$.ajax({ 
    type: 'POST', 
    url: '/Action/Method', 
    data: { CustomObject: firstObj, Objects: objsArray }, 
    //Success/error handlers here 
}); 

और अंत में (मुझे पता है, काफी कुछ code) यहाँ विधि का अवलोकन मेरे पास है:

public class ActionController : Controller { 
    public JsonResult Method(PageModel model) { 
     //Gets here - model.CustomObject is filled correctly, and model.Objects has a correct count of whatever data I passed to the method - but all of the properties are empty! 
    } 
} 

जैसा कि मैंने कहा था, पहली वस्तु भरी है और जब मैं डीबग करता हूं और कदम उठाता हूं तो सभी डेटा वहां होता है। यदि मैं JSON ऑब्जेक्ट में Objects सरणी में दो ऑब्जेक्ट्स पास करता हूं, तो मुझे नियंत्रक में Count 2 में से 2 देखते हैं, लेकिन Custom2Id और SubItemId खाली हैं। क्या देता है?

जब मैं $.ajax कॉल में 'application/json' के contentType निर्दिष्ट करता हूं, तो एमवीसी पास होने वाले डेटा के बारे में शिकायत करता है। एमवीसी विधि में model पैरामीटर को दो अलग-अलग पैरामीटर में विभाजित करने का भी प्रयास किया, लेकिन इससे मदद नहीं मिलती है।

किसी भी मदद की बहुत सराहना की जाती है - यह मुझे स्टंप कर दिया गया है!

उत्तर

5

तो, इस विशेष मुद्दे का समाधान एसओ पर कहीं और दो या दो से अधिक समाधानों का संयोजन है (उनमें से एक संभवतः जेकब का उत्तर सामान्य संग्रह प्रकार - IEnumerable के उपयोग के आसपास घूम रहा है - एक और ठोस के विपरीत एक - List)।

सबसे पहले, सर्वर साइड कोड को बदलने की आवश्यकता नहीं है - सभी उस मोर्चे पर अच्छी तरह से हैं। किए जाने वाले सभी परिवर्तन क्लाइंट साइड हैं, और विशेष रूप से jQuery और आपके जावास्क्रिप्ट ने सर्वर को डेटा कैसे भेजा है।

यहाँ वर्ष जावास्क्रिप्ट है:

$.ajax({ 
    type: 'POST', 
    url: '/Action/Method', 
    data: { CustomObject: firstObj, Objects: objsArray }, 
    //Success/error handlers here 
}); 

पहले यहां मुद्दा यह है कि जावास्क्रिप्ट '/Action/Method' पर सर्वर को सूचित नहीं किया गया है वास्तव में क्या आप (भेज रहे हैं यह द्विआधारी है, यह, मानकों का एक मिश्रण है या है यह JSON?) इसलिए contentType: 'application/json' लाइन जोड़कर उस उद्देश्य को पूरा किया जाएगा। जब आप ऐसा करते हैं, तो सर्वर को पता है कि इसे JSON को डीकोड करना होगा ...

लेकिन जैसा कि यह अभी खड़ा होगा, कोड को अपनाने के अपवाद के साथ डिकोडिंग विफल हो जाएगी ("Invalid JSON primitive") कोड भी आपकी विधि में प्रवेश करता है (एमवीसी डिकोडिंग और बाध्यकारी संभालती है)। उपरोक्त AJAX कॉल में, मैं $.ajax विकल्पों में एक नया JSON ऑब्जेक्ट बना रहा था, लेकिन जेएसओएन भेजा जा रहा है जो एक JSON सत्यापनकर्ता पास नहीं करेगा (जेम्स क्यूबर्ज़ ने एक महान JSON सत्यापनकर्ता का उल्लेख किया है: JSONLint Validator)। इसके बजाय, $.ajax कॉल से पहले JSON ऑब्जेक्ट बनाएं, और ऑब्जेक्ट को स्ट्रिंग करें ताकि यह एक उचित JSON प्रारूप में हो। कुल मिलाकर, यहाँ क्या AJAX कॉल कैसा दिखना चाहिए: - `IEnumerable`,` IList`, `List` सभी का उत्पादन एक ही परिणाम -

var dataObj = { CustomObject: firstObj, Objects: objsArray }; 

$.ajax({ 
    type: 'POST', 
    url: '/Action/Method', 
    contentType: 'application/json', 
    data: JSON.stringify(dataObj), 
    //Success/error handlers here 
}); 
+0

धन्यवाद इससे बहुत मदद मिली :)! – Rookian

+0

घंटों के बाद पूरी तरह से कार्यात्मक कोड की तलाश में, यह मेरी समस्या हल हो गई! धन्यवाद!! –

3

बदलें public IEnumerable<CustomObject2> Objects { get; set; }List<CustomObject2>

को मॉडल बांधने की मशीन IEnumerable इंटरफ़ेस का एक उदाहरण बनाने के लिए कैसे पता नहीं है, यह कुछ अधिक ठोस की जरूरत है।

आप भी इस को बदलने की जरूरत:

data: { CustomObject: firstObj, Objects: objsArray }

में

data: { model: { CustomObject: firstObj, Objects: objsArray } }

model हिस्सा अपनी कार्रवाई में पैरामीटर का नाम मेल खाता है।

+0

मैं इस के साथ चारों ओर निभाई है वस्तुओं की सही संख्या के साथ एक सूची है कि कोई मूल्य नहीं है। – Mattygabe

+0

मैं आपके दूसरे भाग से असहमत हूं - जबकि यह कुछ मामलों में मदद कर सकता है, एमवीसी 3 यह समझने के लिए पर्याप्त स्मार्ट है कि मैं जिस डेटा को पास कर रहा हूं वह मेरे 'मॉडल' पैरामीटर से संबंधित है। ऊपर वर्णित कार्य समाधान एमवीसी को खुश करने के लिए अतिरिक्त ऑब्जेक्ट परत निर्दिष्ट नहीं करता है - यह समझने में सक्षम है कि मैं क्या कर रहा हूं। – Mattygabe

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