5

पर एक int सरणी पास करना मैं जावास्क्रिप्ट से एक एमवीसी नियंत्रक में int की एक सरणी पास करने की कोशिश कर रहा हूं जो 2 मानकों को स्वीकार करता है - एक int सरणी और एक int। यह नियंत्रक कार्रवाई द्वारा लौटाए गए दृश्य में एक पृष्ठ रीडायरेक्ट करने के लिए है।एमवीसी नियंत्रक

var dataArray = getAllIds(); //passes back a JavaScript array 
window.location.replace("/" + controllerName + "/EditAll?ids=" + dataArray + "&currentID=" + dataArray[0]) 

डेटाअरे में मेरे नमूना उपयोग के लिए अपेक्षित 1,7 शामिल हैं।

नियंत्रक कोड

public virtual ActionResult EditAll(int[] ids, int currentID) 
{ 

    currentModel = GetID(currentID); 
    currentVM = Activator.CreateInstance<ViewModel>(); 
    currentVM.DB = DB; 
    currentVM.Model = currentModel; 
    currentVM.ViewMode = ViewMode.EditAll; 
    currentVM.ModelIDs = ids; 

    if (currentModel == null) 
    { 
     return HttpNotFound(); 
    } 

    return View("Edit", MasterName, currentVM); 
} 

मुद्दा यह है कि जब पूर्णांक [] आईडी नियंत्रक के लिए पारित किया निरीक्षण, यह मान शून्य है है। currentID को उम्मीद के अनुसार 1 पर सेट किया गया है।

मैंने jQuery.ajaxSettings.traditional = true को सेट करने का प्रयास किया है जिसका कोई प्रभाव नहीं है मैंने जावास्क्रिप्ट में @ Url.Action का उपयोग कर सर्वर साइड यूआरएल बनाने का भी प्रयास किया है। मैंने JSON को भी आजमाया। सरणी को पार करने से पहले स्ट्रिंग करें

window.location.replace("/" + controllerName + "/EditAll?ids=" + JSON.stringify(dataArray) + "&currentID=" + dataArray[0]) 

फिर आईडी सरणी नियंत्रक पक्ष पर शून्य हो जाती है।

क्या किसी को भी नियंत्रक को सही ढंग से पास करने के लिए int सरणी प्राप्त करने पर कोई संकेतक है? मैं पैरामीटर को कंट्रोलर एक्शन में स्ट्रिंग के रूप में घोषित कर सकता हूं और मैन्युअल रूप से पैरामीटर को क्रमबद्ध और डी-सीरियलाइज कर सकता हूं लेकिन मुझे यह समझने की जरूरत है कि फ्रेम प्रकार को स्वचालित प्रकार के रूपांतरणों को स्वचालित रूप से कैसे किया जाए।

धन्यवाद!

उत्तर

9

एमवीसी में सरल मानों की एक सरणी पास करने के लिए, आपको बस एक ही नाम एकाधिक मानों को देना होगा। यूआरआई इस

/{controllerName}/EditAll?ids=1&ids=2&ids=3&ids=4&ids=5&currentId=1 

डिफ़ॉल्ट मॉडल MVC में बाध्यकारी सही ढंग से पूर्णांक सरणी कार्रवाई पैरामीटर को यह बाँध होगा की तरह कुछ के लिए देख खत्म हो जाएगा।

अब, यदि यह जटिल मूल्यों की एक श्रृंखला थी, तो मॉडल बाध्यकारी के लिए दो दृष्टिकोण किए जा सकते हैं। मान लीजिए कि आप तो

public class ComplexModel 
{ 
    public string Key { get; set; } 

    public string Value { get; set; } 
} 

की तरह एक प्रकार और

public virtual ActionResult EditAll(IEnumerable<ComplexModel> models) 
{ 
} 

के एक नियंत्रक कार्रवाई हस्ताक्षर मॉडल सही ढंग से बाध्यकारी के लिए है लगता है चलो, मान अनुरोध में कोई इंडेक्सर उदा शामिल करने की ज़रूरत

/{controllerName}/EditAll?models[0].Key=key1&models[0].Value=value1&models[1].Key=key2&models[1].Value=value2 

हम यहाँ एक int इंडेक्सर उपयोग कर रहे हैं, लेकिन आप कल्पना कर सकते हैं कि इस जहां यूआई में एक उपयोगकर्ता के लिए प्रस्तुत आइटम संग्रह में जोड़ा जा सकता है और नष्ट कर दिया किसी भी सूचकांक/स्लॉट में एक आवेदन में काफी अनम्य हो सकता है । इस उद्देश्य के लिए, एमवीसी आपको संग्रह में प्रत्येक आइटम के लिए अपना इंडेक्सर निर्दिष्ट करने की अनुमति देता है और उस मान को डिफ़ॉल्ट मॉडल के अनुरोध के साथ अनुरोध के साथ पास करता है उदा।

/{controllerName}/EditAll?models.Index=myOwnIndex&models[myOwnIndex].Key=key1&models[myOwnIndex].Value=value1&models.Index=anotherIndex&models[anotherIndex].Key=key2&models[anotherIndex].Value=value2 

यहाँ हम हमारे अपने indexers, myOwnIndex और anotherIndex मॉडल जटिल प्रकार के एक संग्रह बाध्य करने के लिए उपयोग करने के लिए बाध्यकारी के लिए निर्दिष्ट किया है। जहां तक ​​मुझे पता है, आप अपने सूचकांक के लिए किसी भी स्ट्रिंग का उपयोग कर सकते हैं।

वैकल्पिक रूप से, आप यह निर्धारित करने के लिए अपने मॉडल बाइंडर को कार्यान्वित कर सकते हैं कि आने वाले अनुरोध को मॉडल के लिए कैसे बाध्य किया जाना चाहिए। डिफ़ॉल्ट ढांचे सम्मेलनों का उपयोग करने के लिए इसके लिए अधिक काम की आवश्यकता है लेकिन लचीलापन की एक और परत जोड़ता है।

+0

क्या इस तथ्य के आसपास कोई समस्या नहीं है कि आपको सरणी के चारों ओर लूपिंग करके और प्रत्येक तत्व को क्वेरी स्ट्रिंग में जोड़कर लंबी स्ट्रिंग बनाना है? –

+0

आपने टैग किया है कि आप jQuery का उपयोग कर रहे हैं, इसलिए आपको अपने लिए एन्कोडेड मान बनाने के लिए '$ .param' http://api.jquery.com/jQuery.param/ का उपयोग करने में सक्षम होना चाहिए। 'window.location.replace ("/"+ नियंत्रकनाम +"/संपादित करें? "+ $ .param ({आईडी: डेटाअरे, वर्तमान आईडी: डेटाअरे [0]}))' –

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