एमवीसी 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 जोखिम एक दशक में बग कोई भी कभी नीचे नहीं जा सकता है।
हम्म वास्तव में यह नहीं है। एक JSONified ऑब्जेक्ट एक स्ट्रिंग है। मैं जिस स्ट्रिंग को पोस्ट कर रहा हूं और "भाषाटैग" नामक सदस्य के साथ एक JSONified ऑब्जेक्ट के बीच कोई अलग नहीं है। – JamesBrownIsDead
@JamesBrownIsDead - वास्तव में, जैसा कि मैं इसे समझता हूं, एक अंतर है। नीचे मेरे जवाब पर एक नज़र डालें। – kdawg