बिना फॉर्म के मैं ASP.NET MVC कंट्रोलर के लिए स्ट्रिंग की एक सरणी कैसे पोस्ट कर सकता हूं?


185

मैं खुद को ASP.NET MVC और JQuery को पढ़ाने के लिए एक छोटा सा ऐप बना रहा हूं, और उनमें से एक पृष्ठ उन मदों की एक सूची है जिसमें कुछ का चयन किया जा सकता है। फिर मैं एक बटन दबाना चाहता हूं और अपने नियंत्रक को एक सूची (या कुछ समतुल्य) भेज सकता हूं जिसमें चयनित आइटमों के आईडी हैं, जो कि JQuery के पोस्ट फ़ंक्शन का उपयोग कर रहे हैं।

मैं चयनित तत्वों के आईडी के साथ एक सरणी प्राप्त करने में कामयाब रहा, और अब मैं इसे पोस्ट करना चाहता हूं। एक तरह से मैं यह कर सकता था कि मेरे पेज में एक डमी फॉर्म है, एक छिपे हुए मूल्य के साथ, और फिर चयनित वस्तुओं के साथ छिपे हुए मूल्य को सेट करें, और उस फॉर्म को पोस्ट करें; हालांकि यह गंभीर दिखता है।

क्या नियंत्रक को सीधे सरणी भेजकर, इसे प्राप्त करने का एक क्लीनर तरीका है? मैंने कुछ अलग चीजों की कोशिश की है, लेकिन ऐसा लगता है कि नियंत्रक उस डेटा को मैप नहीं कर सकता है जो इसे प्राप्त कर रहा है। यहाँ अब तक का कोड है:

function generateList(selectedValues) {
   var s = {
      values: selectedValues //selectedValues is an array of string
   };
   $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}

और फिर मेरा नियंत्रक ऐसा दिखता है

public ActionResult GenerateList(List<string> values)
{
    //do something
}

सभी मैं प्राप्त करने में कामयाब नियंत्रक पैरामीटर में एक "शून्य" है ...

कोई सुझाव?


यद्यपि, आप उसी डेटा का उपयोग करके एक्सेस कर सकते हैंRequest["values[]"]
Tocco

जवाबों:


247

मैंने एक परीक्षण ऐप के लिए कोड शामिल करने के लिए अपनी प्रतिक्रिया को संशोधित किया।

अपडेट: मैंने 'पारंपरिक' सेटिंग को सही करने के लिए jQuery को अपडेट किया है ताकि यह फिर से काम करे (प्रति @DustinDavis 'उत्तर)।

पहले जावास्क्रिप्ट:

function test()
{
    var stringArray = new Array();
    stringArray[0] = "item1";
    stringArray[1] = "item2";
    stringArray[2] = "item3";
    var postData = { values: stringArray };

    $.ajax({
        type: "POST",
        url: "/Home/SaveList",
        data: postData,
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });
}

और यहाँ मेरे नियंत्रक वर्ग में कोड है:

public JsonResult SaveList(List<String> values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}

जब मैं उस जावास्क्रिप्ट फ़ंक्शन को कॉल करता हूं, तो मुझे एक चेतावनी मिलती है जो कहती है "सूची में पहला आइटम: 'आइटम 1'"। उम्मीद है की यह मदद करेगा!


3
यह अच्छा है कि मुझे यह उत्तर मिला है, अब मैं दिशा-निर्देश भेजने में सक्षम हूं और कार्रवाई उन्हें सूची <दिशानिर्देश> पर भेजती है। धन्यवाद
TX3

43
यहाँ ध्यान देने योग्य दो महत्वपूर्ण बातें। 1) dataType: "json" 2।) पारंपरिक: सच है। उनके साथ स्ट्रिंग
ऐर वॉन्ट

1
ध्यान दें कि dataType: 'JSON'JQuery के जवाब को JSON के रूप में पार्स करने का प्रयास करने का कारण बनता है, और यह JSON मान्य नहीं होने पर त्रुटि करेगा।
सेनेट

8
@ थैनिगैनाथन dataType: 'json'रिटर्न प्रकार के लिए है और एक्शन के लिए सरणी भेजने की आवश्यकता नहीं है। contentType: "application/json; charset=utf-8", एक है, लेकिन कुछ मामलों में इस तरह की आवश्यकता नहीं है।
14:30

1
@emzero उपयोगvar postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
निक एम

108

FYI करें: JQuery ने पोस्ट डेटा को क्रमबद्ध करने के तरीके को बदल दिया।

http://forum.jquery.com/topic/nested-param-serialization

आपको 'ट्रडिशनल' सेटिंग को सही, अन्य वार को सेट करना होगा

{ Values : ["1", "2", "3"] }

के रूप में बाहर आ जाएगा

Values[]=1&Values[]=2&Values[]=3

के बजाय

Values=1&Values=2&Values=3

8
यह कुछ ऐसा है जिसने मुझे थोड़ी देर के लिए अपना सिर खुजलाया। सेटिंग $.ajax({ ..., traditional: true});पारंपरिक क्रमांकन पर वापस जाने में मदद करेगी।
जुहान_ह

मुझे ASP.NET MVC रूट के लिए स्ट्रिंग मानों के सरल js सरणी को ठीक से उपभोग करने के लिए इसकी आवश्यकता थी।
ब्रैंडनगॉन

आपका उत्तर वास्तव में मददगार है। मेरी भी यही स्थिति है लेकिन यह साथ है ints। जब मैं उपयोग traditional: trueकरता हूं , तो यह काम करता है, आपका उत्तर और लिंक इसकी वजह बताता है। यह भी काम करता है जब मैं उपयोग करता हूं type: "POST", बिना उपयोग के traditional: true। ऐसा क्यों है? क्या आप विस्तृत कर सकते हैं FYI करें मैं Asp.Net Mvc का उपयोग कर रहा हूं।
बार्न्स

अनुक्रमणिका के बिना इस तरह एक अनाम सरणी पार्स करने के लिए ASP.NET में एक तरीका है? मान [] = 1 और मान [] = 2 और मान [] = 3
चार्ल्स ओवेन

24

उत्तर के लिए सभी को धन्यवाद। JSON ऑब्जेक्ट को स्ट्रिंग में बदलने के लिए पारंपरिक पैरामीटर के साथ सही सेट करने के लिए jQuery.param विधि का उपयोग करने के लिए एक और त्वरित समाधान होगा :

$.post("/your/url", $.param(yourJsonObject,true));

अच्छी तरह से काम करता है और पूरी तरह से मेरे लिए फिट है क्योंकि मैं $ .Pax () के बजाय $ .post () का उपयोग कर रहा हूं। धन्यवाद !
१५:३० पर

9

सरणी के रूप में डेटा पोस्ट न करें। एक सूची में बाँधने के लिए, कुंजी / मूल्य जोड़े को प्रत्येक कुंजी के लिए समान मूल्य के साथ प्रस्तुत किया जाना चाहिए।

ऐसा करने के लिए आपको एक फॉर्म की आवश्यकता नहीं होनी चाहिए। आपको बस कुंजी / मूल्य जोड़े की एक सूची की आवश्यकता है, जिसे आप कॉल में $ .post में शामिल कर सकते हैं।


3
धन्यवाद। अपडेट किया गया url है: haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
Wiebe Tijsma

6

में .NET4.5,MVC 5

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

जेएस में वस्तु: यहां छवि विवरण दर्ज करें

तंत्र जो पोस्ट करता है।

    $('.button-green-large').click(function() {
        $.ajax({
            url: 'Quote',
            type: "POST",
            dataType: "json",
            data: JSON.stringify(document.selectedProduct),
            contentType: 'application/json; charset=utf-8',
        });
    });

सी#

वस्तुओं:

public class WillsQuoteViewModel
{
    public string Product { get; set; }

    public List<ClaimedFee> ClaimedFees { get; set; }
}

public partial class ClaimedFee //Generated by EF6
{
    public long Id { get; set; }
    public long JourneyId { get; set; }
    public string Title { get; set; }
    public decimal Net { get; set; }
    public decimal Vat { get; set; }
    public string Type { get; set; }

    public virtual Journey Journey { get; set; }
}

नियंत्रक:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}

प्राप्त वस्तु:

यहां छवि विवरण दर्ज करें

आशा है कि यह आपको कुछ समय बचाता है।


4

एक और कार्यान्वयन जो वस्तुओं की सूची के साथ भी काम कर रहा है, न कि केवल तार:

जे एस:

var postData = {};
postData[values] = selectedValues ;

$.ajax({
    url: "/Home/SaveList",
    type: "POST",
    data: JSON.stringify(postData),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(data){
        alert(data.Result);
    }
});

यह मानते हुए कि 'चयनितवैल्यूज़' ऑब्जेक्ट्स का ऐरे है।

नियंत्रक में पैरामीटर संबंधित ViewModels की एक सूची है।

public JsonResult SaveList(List<ViewModel> values)
{    
    return Json(new { 
          Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    });
}

1

जैसा कि मैंने यहां चर्चा की ,

यदि आप MVC कार्रवाई के लिए कस्टम JSON ऑब्जेक्ट पास करना चाहते हैं तो आप इस समाधान का उपयोग कर सकते हैं, यह एक आकर्षण की तरह काम करता है।

public string GetData() {
  // InputStream contains the JSON object you've sent
  String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();

  // Deserialize it to a dictionary
  var dic =
    Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < String,
    dynamic >> (jsonString);

  string result = "";

  result += dic["firstname"] + dic["lastname"];

  // You can even cast your object to their original type because of 'dynamic' keyword
  result += ", Age: " + (int) dic["age"];

  if ((bool) dic["married"])
    result += ", Married";

  return result;
}

इस समाधान का वास्तविक लाभ यह है कि आपको तर्कों के प्रत्येक संयोजन के लिए एक नए वर्ग को परिभाषित करने की आवश्यकता नहीं है और इसके अलावा, आप अपनी वस्तुओं को अपने मूल प्रकारों में आसानी से डाल सकते हैं।

आप अपनी नौकरी को सुविधाजनक बनाने के लिए इस तरह से एक सहायक विधि का उपयोग कर सकते हैं:

public static Dictionary < string, dynamic > GetDic(HttpRequestBase request) {
  String jsonString = new StreamReader(request.InputStream).ReadToEnd();
  return Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < string, dynamic >> (jsonString);
}

0

आप वैश्विक पैरामीटर के साथ सेटअप कर सकते हैं

jQuery.ajaxSettings.traditional = true;

-1

जवाब ने मुझे मेरी स्थिति में बहुत मदद की इसलिए उसके लिए धन्यवाद। हालांकि भविष्य के संदर्भ के लिए लोगों को एक मॉडल से बांधना चाहिए और फिर मान्य करना चाहिए। फिल हैक की यह पोस्ट MVC 2 के लिए इसका वर्णन करती है। http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

आशा है कि यह किसी की मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.