2012-01-30 8 views
6

मैं अपने एएसपी.नेट एमवीसी 3 नियंत्रक एक्शन विधि में कुछ JSON डेटा भेजने की कोशिश कर रहा हूं, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं क्या करता हूं।एएसपी.नेट एमवीसी एक नियंत्रक कार्रवाई में JSON डेटा भेज रहा है

POST http://localhost:51492/Home/GetData HTTP/1.1 
Host: localhost:51492 
Connection: keep-alive 
Content-Length: 171 
Origin: http://localhost:51492 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko)  Chrome/16.0.912.75 Safari/535.7 
Content-Type: application/json; charset=UTF-8; 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://localhost:51492/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"Filters":[{"Field":3,"Operator":0,"Values":["30.01.2012.","30.01.2012."]},{"Field":2,"Operator":0,"Values":["-1"]},{"Field":0,"Operator":0,"Values":["some-string"]}]} 

मेरे ग # कोड:

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

फ़िडलर इस तरह अनुरोध दिखाता है:

यहाँ मेरी ajax कॉल है (यह json2.js से JSON.stringify विधि का उपयोग करता)

[HttpPost] 
public string GetData(QueryFilters filters) 
{ 
    return "Ho ho ho and a bottle of rum."; 
} 

[Serializable] 
public enum Fields 
{ 
     A, 
     B, 
     C, 
     D 
} 

[Serializable] 
public enum FilterOperator 
{ 
    Is, 
    Between, 
    GreaterOrEqual, 
} 

[Serializable] 
public class QueryFilter 
{ 
    public Fields Field { get; set; } 
    public FilterOperator Operator { get; set; } 
    public List<string> Values { get; set; } 
} 

[Serializable] 
public class QueryFilters 
{ 
    public List<QueryFilter> Filters { get; set; } 
} 

मैंने global.asax.cs की Application_Start() विधि में निम्न पंक्ति जोड़ दी है:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

एक्शन विधि 'गेटडाटा' में ब्रेकपॉइंट हिट हो गया है, लेकिन फ़िल्टर संपत्ति का मूल्य शून्य है। कोई विचार?

एक और नोट: मैंने एक बहुत ही सरल वस्तु पारित करने का प्रयास किया है: व्यक्ति - गुण स्ट्रिंग नाम और int आयु, उसी परिणाम के साथ - ऐसा लगता है जैसे स्वचालित मॉडल बाध्यकारी मेरे लिए काम नहीं कर रहा है लेकिन मुझे नहीं पता इसे कैसे जांचें।

उत्तर

5

समस्या यह है कि आपके क्रिया तर्क को filters कहा जाता है और यह आपके QueryFilters मॉडल के अंदर आपके पास Filters नामक एक संपत्ति है जो डिफ़ॉल्ट मॉडल बाइंडर को भ्रमित करती है।

तो बस अपने कार्रवाई तर्क का नाम बदलने:

[HttpPost] 
public ActionResult GetData(QueryFilters model) 
{ 
    return Json("Ho ho ho and a bottle of rum."); 
} 

ओह और देखा कि कार्रवाई नहीं ActionResults तार लौटना चाहिए।

इसके अलावा अपने Global.asax से निम्न पंक्ति को हटा दें:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

ASP.NET MVC 3 पहले से ही इस में निर्मित है।

या आप पूरी तरह से किसी कारण से आपका कार्रवाई तर्क filters तो आप भी JSON अनुरोध आप इस के लिए भेज रहे हैं को संशोधित कर सकता है कहा जाता है की जरूरत है, तो:

data: JSON.stringify({ 
    filters: { 
     Filters: [ 
      { "Field": 3, "Operator": 0, "Values": ["30.01.2012.", "30.01.2012."] }, 
      { "Field": 2, "Operator": 0, "Values": ["-1"] }, 
      { "Field": 0, "Operator": 0, "Values": ["some-string"] } 
     ] 
    } 
}), 

अब वहाँ कोई और अधिक अस्पष्टता है।

+0

+1 अच्छी तरह से देखा गया। मुझे उस चीज़ को नहीं मिला जो मैंने अपने उत्तर में संदर्भित किया था, इसलिए इसे हटा दिया है ... –

+0

बहुत बहुत धन्यवाद! मैं समझ नहीं पा रहा हूं कि मुझे कितना निराशा हुई, एक बिलियन अलग-अलग चीजों की कोशिश की और यह एक साधारण नामकरण मुद्दा साबित हुआ। – skali

+0

सभी तरह से बहुत बढ़िया, मैं इसके लिए दूर और करीब देख रहा हूं, लेकिन निश्चित रूप से, यह ढेर पर है! –

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