AJAX के माध्यम से एमएक्स एक्शन के लिए सरणी पास करें


123

मैं एक सरणी (या IEnumerable) की अटेक्स को AJAX से MVC एक्शन के माध्यम से पास करने की कोशिश कर रहा हूं और मुझे थोड़ी मदद की जरूरत है।

जावास्क्रिप्ट है

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

और नियंत्रक कार्रवाई है

public ActionResult MyAction(IEnumerable<int> arrayOfValues )

फिलहाल अनुरोध के रूप में स्वरूपित किया गया है

controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437

तो मैं लगभग वहाँ हूँ, अगर मैं सही प्रतिक्रिया प्राप्त करता हूं तो मैं वर्ग कोष्ठक लेता हूं। मुझे उस एरे को कैसे प्राप्त करना चाहिए ताकि नियंत्रक यह पहचान सके कि यह क्या है?

आपकी मदद के लिए बहुत धन्यवाद

डेव

जवाबों:


149

कॉल करने से पहले पारंपरिक संपत्ति को सही पर सेट करें। अर्थात:

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 

3
धन्यवाद! क्या आप कृपया पारंपरिक और गैर पारंपरिक अजाक्स के बीच अंतर को रेखांकित कर सकते हैं? मैं बेहतर यह समझना चाहूंगा कि मैं अपने आवेदन के बाकी हिस्सों में क्या कर रहा हूं।
टॉम बीच

5
आप एकल कॉल में पारंपरिक सेटिंग भी जोड़ सकते हैं। तब यह बाकी को प्रभावित नहीं करेगा
Gluip

1
यह उत्तर सही है, लेकिन यदि आप सिंगल कॉल चेक @RionWilliams उत्तर के लिए "पारंपरिक" सेट करना पसंद करते हैं। दोनों को वोट देना। धन्यवाद!
kzfabi

@ बिट बिच jQuery 1.4 के रूप में, $ .param () विधि आधुनिक स्क्रिप्टिंग भाषाओं और फ्रेमवर्क जैसे PHP और रूबी पर रेल्स को समायोजित करने के लिए पुनरावर्ती रूप से गहरी वस्तुओं को क्रमबद्ध करती है। आप jQuery.ajaxSettings.traditional = true सेट करके इस कार्यक्षमता को विश्व स्तर पर अक्षम कर सकते हैं;
अलेक्सी श्वेलेव

इन उत्तरों में से कोई भी मेरे लिए (? शायद क्योंकि मेरे नियंत्रक एक API नियंत्रक था) काम किया, लेकिन मैं निम्नलिखित तो जवाब में मेरे समाधान: stackoverflow.com/a/11100414/1751792
एकतरफा

119

जब मैं POST करने का प्रयास कर रहा हूं, तो मेरे पास अतीत में मुद्दे हैं (निश्चित नहीं कि अगर आप वास्तव में क्या कर रहे हैं, लेकिन मुझे याद है कि एक सरणी को पार करते समय, पारंपरिक को सही पर सेट होना चाहिए

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({ 
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }              
 });

4
यह सिर्फ आँख बंद करके इसे एक वेब.कॉन्फ़िग फ़ाइल में विश्व स्तर पर स्थापित करने से बहुत बेहतर है, जैसा कि कुछ लोग सुझाव देते हैं। दूसरे के पास अच्छे अवसरों का अपना सेट है, लेकिन आपका डिफ़ॉल्ट समाधान होना चाहिए।
Panzercrisis

यह केवल ActionResult के लिए पैरामीटर के रूप में डेटा भेज रहा है, क्या यह ActionResult के अंदर कोड को लागू करेगा? उदाहरण के लिए अगर डेटाबेस में अरोफाल्व्यूल्स डालने के लिए कुछ कोड है, तो क्या वह कोड चलेगा?
सौरभ

यह वही है जो मुझे चाहिए था। मेरे सरणियाँ मेरे नियंत्रक में शून्य के रूप में वापस आती
रहीं

52

काफी देर से, लेकिन पहले से ही यहां मौजूद लोगों के लिए अलग जवाब:

यदि $.ajaxआप शॉर्टहैंड फ़ंक्शंस का उपयोग करना चाहते हैं $.getया $.post, आप इस तरह सरणियाँ पास कर सकते हैं:


शॉर्टहैंड जी.ई.टी.

var array = [1, 2, 3, 4, 5];
$.get('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

शॉर्टहैंड पोस्ट

var array = [1, 2, 3, 4, 5];
$.post('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
    // do stuff here
}


टिप्पणियाँ:

  • में बूलियन पैरामीटर $.paramके लिए है traditionalसंपत्ति, जो होना चाहिए trueकाम करने के लिए इस बात के लिए

2
पारंपरिक संपत्ति के बारे में टिप के लिए धन्यवाद। मैं यह पता नहीं लगा सका कि मेरा सी # परम क्यों अशक्त था। मैंने पाया कि C # एक्शन विधि में "int []" प्रकार भी काम करेगा।
डैन रैंडोल्फ

9

आपको यह ठीक करने में सक्षम होना चाहिए:

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify({
      myKey: myArray
   }),
   success: function(data) { /* Whatever */ }
});

तब आपकी कार्रवाई विधि इस प्रकार होगी:

public ActionResult(List<int> myKey)
{
    // Do Stuff
}

आपके लिए, ऐसा लगता है कि आपको अपने मूल्यों को कठोर बनाने की आवश्यकता है। MVC में JSONValueProvider उस IE को आपके लिए IEnumerable में बदल देगा।


उत्तर के लिए धन्यवाद, लेकिन मुझे लगता है कि ऐसा लगता है कि मुझे पारंपरिक को सच करने की आवश्यकता है। मुझे लगता है कि यह भी काम करेगा के रूप में उत्थान किया है।
डेव

9

'पारंपरिक' विकल्प का उपयोग करने का उत्तर सही है। मैं इसके लिए कुछ और पृष्ठभूमि की जानकारी प्रदान कर रहा हूं जो अधिक जानने की इच्छा रखते हैं।

JQuery के दस्तावेज़ से:

1.8 jQuery के रूप में, $ .param () विधि अब jQuery.ajaxSettings.traditional को अपनी डिफ़ॉल्ट सेटिंग के रूप में उपयोग नहीं करती है और झूठे के लिए डिफ़ॉल्ट होगी।

आप यहाँ और भी पढ़ सकते हैं: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers और http://haacked.com/archive /2008/10/23/model-binding-to-a-list.aspx

HTH


2

यदि सभी अन्य विफल होते हैं...

यहाँ अन्य किसी भी उत्तर ने मेरी समस्या हल नहीं की। मैं जावास्क्रिप्ट से एक एमवीसी वेब एपीआई नियंत्रक के लिए एक जीईटी विधि कॉल करने का प्रयास कर रहा था, और उस अनुरोध के भीतर एक पूर्णांक के एक पैरामीटर को पैरामीटर के रूप में भेजने के लिए। मैंने यहां सभी समाधानों की कोशिश की, लेकिन फिर भी मेरे नियंत्रक पर पैरामीटर NULL (या आपके लिए VB उपयोगकर्ताओं के लिए कुछ भी नहीं) आ रहा था।

मैंने अंततः अपना समाधान एक अलग एसओ पोस्ट में पाया , और यह वास्तव में बहुत सरल था: बस [FromUri]नियंत्रक में सरणी पैरामीटर से पहले एनोटेशन जोड़ें ( मुझे ब्रैकेट एनोटेशन से बचने के लिए "पारंपरिक" AJAX सेटिंग का उपयोग करके कॉल भी करना था )। अपने आवेदन में मेरे द्वारा उपयोग किए जाने वाले वास्तविक कोड के लिए नीचे देखें।


नियंत्रक हस्ताक्षर:

नियंत्रक हस्ताक्षर नोट: C # में एनोटेशन होगा [FromUri]


जावास्क्रिप्ट:

$.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);});

वास्तविक URL स्ट्रिंग:

http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning

2

यहाँ थोड़ी देर हो गई, लेकिन मैं SNag के समाधान को $ .ajax () में आगे उपयोग कर सकता था। यहाँ कोड है अगर यह किसी की मदद करेगा:

var array = [1, 2, 3, 4, 5];

$.ajax({
    type: "GET",
    url: '/controller/MyAction',
    data: $.param({ data: array}, true),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
    },
    error: function (x, y, z) {
    }
});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

1

यदि आप .Net फ्रेमवर्क MVC से ASP.NET कोर MVC में माइग्रेट कर रहे हैं, जैसे मैं था, चीजें थोड़ी बदल गई हैं। AJAX कॉल कच्ची वस्तु पर होनी चाहिए ताकि स्ट्रिंग डेटा का उपयोग किया जा सके, बजाय इसके कि डेटा पास { vals: arrayOfValues }किया जाना चाहिए JSON.stringify(arrayOfValues):

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify(arrayOfValues),
   success: function(data) { /* Whatever */ }
});

ASP.NET Core में जो दूसरा बदलाव किया गया है, वह है क्रॉस-साइट रिक्वेस्ट फर्जीवाड़ा को रोकना ताकि एमजेसी एक्शन के लिए कॉल अजाक्स मेथड से [FromBody]हो सके, एक्शन श्रद्धांजलि एक्शन पैरामीटर पर लागू होना चाहिए:

public ActionResult MyAction([FromBody] IEnumerable<int> arrayOfValues )

धन्यवाद यह अविश्वसनीय रूप से उपयोगी था कि डेटा भेजने में विफल रहने के तरीकों के हर दूसरे क्रमपरिवर्तन के बाद!
निब्लीपिग

0

यदि आप ASP.NET Core MVC का उपयोग कर रहे हैं और आपको वर्ग ब्रैकेट्स को संभालने की आवश्यकता है (बजाय jQuery "पारंपरिक" विकल्प का उपयोग करने के लिए), तो एकमात्र विकल्प जो मैंने पाया है वह है मैन्युअल रूप IEnumerableसे कॉनोलर विधि का निर्माण करना ।

string arrayKey = "p[]=";
var pArray = HttpContext.Request.QueryString.Value
    .Split('&')
    .Where(s => s.Contains(arrayKey))
    .Select(s => s.Substring(arrayKey.Length));

0

मैं asp.net core 2.2 और jquery के साथ काम करता हूं और एक जटिल ऑब्जेक्ट ('मुख्य वर्ग') को सरल डेटा फ़ील्ड और कुछ सरणी के साथ नियंत्रक से एक दृश्य में सबमिट करना पड़ता है।
जैसे ही मैंने सरणी को c # 'मुख्य वर्ग' परिभाषा (नीचे देखें) में जोड़ा है और ajax (पोस्ट) पर (सही भरा हुआ) सरणी सबमिट किया है, पूरे ऑब्जेक्ट कंट्रोलर में शून्य था।
पहले, मैंने सोचा, मेरे "अजाक्स कॉल" के लिए लापता "पारंपरिक: सच", लेकिन यह मामला नहीं है।
मेरे मामले में कारण सी # 'मुख्य वर्ग' में परिभाषा थी।
'मुख्य वर्ग' में, मेरे पास था:

public List<EreignisTagNeu> oEreignistageNeu { get; set; }

और EreignisTagNeu को इस रूप में परिभाषित किया गया था:

public class EreignisTagNeu
{
 public int iHME_Key { get; set; } 
}

मुझे 'मुख्य वर्ग' में परिभाषा को बदलना पड़ा:

 public List<int> oEreignistageNeu { get; set; }

अब यह काम कर रहा है।
तो ... मेरे लिए ऐसा लगता है जैसे कि asp.net core में एक समस्या है (पोस्ट के साथ), अगर किसी ऐरे के लिए लिस्ट को पूरी तरह से 'मेन क्लास' में परिभाषित नहीं किया गया है।
नोट: मेरे मामले में यह अजाक्स कॉल के लिए "पारंपरिक: सच" के साथ या इसके बिना काम करता है


-3

आपको सरणी को स्ट्रिंग में बदलने की आवश्यकता है:

//arrayOfValues = [1, 2, 3];  
$.get('/controller/MyAction', { arrayOfValues: "1, 2, 3" }, function (data) {...

यह int, long या string के रूप में भी काम करता है

public ActionResult MyAction(int[] arrayOfValues )

यह सर्वर पर एरे भेजने के लिए सिंटैक्स भी सही नहीं है। आप बस एक ऑब्जेक्ट पास कर रहे हैं और यह मान रहे हैं कि यह एक सरणी है, जो आपके द्वारा प्रदान की गई चीज के साथ कभी नहीं होगी, जो एक STRING है।
ट्विस्टर 1002
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.