2010-05-18 19 views
5

मैं अपने नियंत्रक में इस मिल गया है:पोस्ट करना JSON नियंत्रक से

[HttpPost] 
    public void UpdateLanguagePreference(string languageTag) 
    { 
     if (string.IsNullOrEmpty(languageTag)) 
     { 
      throw new ArgumentNullException("languageTag"); 
     } 

     ... 
    } 

और नियंत्रक को यह jQuery कोड पोस्ट करने में समस्या:

  jQuery.ajax({ 
       type: 'POST', 
       url: '/Config/UpdateLanguagePreference', 
       contentType: 'application/json; charset=utf-8', 
       data: '{ "languageTag": "' + selectedLanguage + '" }' 
      }); 

मैं कोड करने का प्रयास करते, तथापि, मैं त्रुटि प्राप्त करें:

Server Error in '/' Application. 
Value cannot be null. 
Parameter name: languageTag 

समस्या क्या है? क्या यह एक एमवीसी नियंत्रक को जेएसओएन पोस्ट करने के लिए नहीं है? मैं फिडलर का उपयोग कर POST की जांच कर सकता हूं और देख सकता हूं कि अनुरोध सही है। किसी कारण से, UpdateLanguagePreference() को शून्य या खाली स्ट्रिंग मिल रही है।

उत्तर

1

हम्म ....

मैं इसे

$.post(target, 
     { 
      "ProblemId": id, 
      "Status": update 
     }, ProcessPostResult); 

public class ProblemReportUpdate 
    { 
     public int ProblemId { get; set; } 
     public string Status { get; set; } 
    } 

और

[HttpPost] 
public ActionResult UpdateProblemReport(ProblemReportUpdate update) 

के साथ लक्ष्य

द्वारा निर्धारित है कर
var target = '<%=Url.Action("UpdateProblemReport", "ProblemReport") %> 
1

आप एक स्ट्रिंग पोस्ट कर रहे हैं, न कि JSONified ऑब्जेक्ट।

डेटा: '{ "languageTag": "' + selectedLanguage + ''} '

होना चाहिए

डेटा: {" languageTag ": selectedLanguage}

और यकीन है कि selectedLanguage बनाने परिभाषित किया गया है अपने AJAX कॉल के दायरे में।

+0

हम्म वास्तव में यह नहीं है। एक JSONified ऑब्जेक्ट एक स्ट्रिंग है। मैं जिस स्ट्रिंग को पोस्ट कर रहा हूं और "भाषाटैग" नामक सदस्य के साथ एक JSONified ऑब्जेक्ट के बीच कोई अलग नहीं है। – JamesBrownIsDead

+0

@JamesBrownIsDead - वास्तव में, जैसा कि मैं इसे समझता हूं, एक अंतर है। नीचे मेरे जवाब पर एक नज़र डालें। – kdawg

1

जब आप jQuery के $ .ajax() को जावास्क्रिप्ट ऑब्जेक्ट के रूप में डेटा वैरिएबल देते हैं, तो यह वास्तव में इसे कुंजी/मान जोड़े की श्रृंखला में अनुवाद करता है और इसे सर्वर पर भेजता है। जब आप स्ट्रिंग जेसन ऑब्जेक्ट भेजते हैं, तो यह उस रूप में नहीं है और एमवीसी/एमवीसी 2 में मानक मॉडल बाइंडर इसे काट नहीं देगा।

यदि आप इस तरह से पोस्ट डेटा भेजना चाहते हैं, तो आप बहुत करीब हैं। आपको एमवीसी 2 फ्यूचर्स/एमवीसी 3 बीटा में मिली JsonValueProviderFactory कक्षा की आवश्यकता है। अधिक जानकारी के लिए निम्न लिंक पर एक नज़र डालें:

http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

... वहाँ एक और लिंक मैं जब यह अपने आप को अपने ऐप्लिकेशन में JsonValueProviderFactory वर्ग लाने के बारे में अधिक बात को लागू करने के लिए इस्तेमाल किया है, लेकिन मैं नहीं मिल सकता है यह मेरे जीवन के लिए।

7

एमवीसी 3 के तरीके के बारे में एमवीसी 3 में भी बहुत महत्वपूर्ण चेतावनी।

आप कहते हैं की तरह एक वस्तु पार कर लेते हैं:

​{ 
    Test: 'Hi' 
} 

और प्राप्त वर्ग है: यह काम करेंगे

[HttpPost] 
public JsonResult Submit(MyModel model) 
{ 
    . . . 

:

public class MyModel 
{ 
    public string Test { get; set; } 
} 
की तरह एक प्राप्त नियंत्रक विधि के साथ

। लेकिन अगर आपके नियंत्रक विधि यह बहुत ही मामूली, हानिकारक प्रतीत नहीं बदल गया है:

[HttpPost] 
public JsonResult Submit(MyModel test) 
{ 
    . . . 

यह असफल हो जायेगी। ऐसा इसलिए है क्योंकि एमवीसी ढांचा जेएसओएन को उपरोक्त वर्णित एक शब्दकोश में उपभोग करता है, और देखता है कि पैरामीटर में से एक का नाम समान है, केस-असंवेदनशील, इसकी चाबियों में से एक ("टेस्ट"/"टेस्ट")। इसके बाद स्ट्रिंग मान "हाय" लेता है, जिसे टेस्ट को सौंपा जाता है, और इस तर्क को "परीक्षण" में पास करता है, भले ही यह स्पष्ट रूप से लेखक का इरादा नहीं है।

इस बारे में सबसे अधिक समस्याग्रस्त यह है कि ढांचा MyModel प्रकार के एक तर्क को स्ट्रिंग असाइन करने का प्रयास करने में त्रुटि नहीं डालता है, जो कम से कम आपको गलत होने के बारे में एक संकेत देगा। यह नहीं देखता कि यह गलत तरीका था और इसके वैकल्पिक व्यवहार में फॉलबैक था (कि यह पीछा किया होगा कि इन तर्कों/गुणों का नाम मिलान नहीं हुआ है)। यह बस चुपचाप विफल रहता है और आपके तर्क के लिए शून्य को असाइन करता है, जिससे आपको कोई संकेत नहीं मिलता कि क्या हो रहा है।

मैंने इस समस्या को बार-बार चलाया है और आखिरकार गड़बड़ी मिली है जो चीजों को यादृच्छिक रूप से एमवीसी में काम करना बंद कर देता है ... मुझे उम्मीद है कि यह किसी और की मदद करेगा।

चूंकि इस क्रिया तर्क के लिए कोई उचित नाम संभावित रूप से उचित संपत्ति नाम (मॉडल, डेटा इत्यादि) है और चूंकि यह मामला असंवेदनशील है, इसलिए अपना खुद का मॉडल बाइंडर लिखने के बिना इसे रोकने का सबसे सुरक्षित तरीका एक पर मानकीकृत करना है, पागल, बहुत-संभावना नहीं करने के लिए कभी हो-ए-संपत्ति-नाम तर्क का नाम, जैसे:

[HttpPost] 
public JsonResult Submit(MyModel _$_$twinkleTwinkleLittleFuckIt) 
{ 

लेकिन अगर आप समय है, ModelBinder/JsonValueProviderFactory ठीक तो यह है कि एक अजीब के बजाय 0 जोखिम एक दशक में बग कोई भी कभी नीचे नहीं जा सकता है।

+0

यह आपके काम के अनुसार काम करता है लेकिन अगर मेरे पास मॉडल के अंदर किसी ऑब्जेक्ट की एक सूची है तो यह बाध्य नहीं होती है। यह किसी भी खाली सूची का उत्पादन करता है – Bryida

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