2011-03-28 13 views
7

के साथ AJAX क्रियाओं को संभालने का उचित तरीका मेरे पास एक नियंत्रक क्रिया है जो डेटाबेस में कुछ काम करता है और फिर समाप्त होने पर बाहर निकलता है। यह क्रिया jQuery के AJAX फ़ंक्शन के माध्यम से डेटा टाइप के साथ 'json' पर सेट की जा रही है।एएसपी.नेट एमवीसी - कोई रिटर्न ऑब्जेक्ट

यदि मैं शून्य के लिए कार्रवाई का रिटर्न प्रकार सेट करता हूं, तो सब कुछ ठीक काम करेगा, सिवाय इसके कि फ़ायरफ़ॉक्स कंसोल में एक त्रुटि दिखाएगा जो कहता है: "कोई तत्व नहीं मिला"।

यह समझ में आता है कि अगर यह एक्सएमएल वापस आने की उम्मीद कर रहा था तो फ़ायरफ़ॉक्स इस त्रुटि को फेंक देगा। हालांकि, जब भी मैं AJAX कॉल की डेटा टाइप प्रकार को "टेक्स्ट" में बदलता हूं, तब भी मुझे त्रुटि मिलती है। रिटर्न टाइप शून्य के साथ त्रुटि से छुटकारा पाने के लिए, मुझे प्रतिक्रिया का कंटेंट टाइप "टेक्स्ट/एचटीएमएल" पर सेट करना होगा। या मैं रिटर्न टाइप को जेसनआरसल्ट पर सेट कर सकता हूं और एक नया [खाली] जेसन रीसेट ऑब्जेक्ट वापस कर सकता हूं।

मुझे यकीन है कि मैं इस त्रुटि को दूर करने के कई तरीके हैं, लेकिन मैं एजेक्स के माध्यम से किसी भी वापसी मूल्य के बिना कार्रवाई को संभालने का उचित तरीका जानना चाहता था।

यदि यह महत्वपूर्ण है, तो मैं एसिंक नियंत्रक क्रिया पैटर्न का भी उपयोग कर रहा हूं।

public void DoSomethingAsync(SomeJsonObjectForModelBinding model) 
{ 
    // do some database things 
} 

public void DoSomethingCompleted() 
{ 
    // nothing to do... 
    // what should my return type be? 
    // do I need to set the content type here? 
} 

उत्तर

11

मैं जानता हूँ कि यह वास्तव में आपके प्रश्न का उत्तर नहीं है, लेकिन मैं तर्क है कि आप हमेशा एक वापसी मान एक AJAX या वेब सेवा कॉल से वापस आ रहा होना चाहिए। यहां तक ​​कि अगर आपको केवल यह बताने के लिए कि ऑपरेशन सफल था, या अन्यथा आपको त्रुटि (संदेश) वापस लौटा दें।

मैं अक्सर इस तरह एक वर्ग को परिभाषित:

public class JsonResultData 
{ 
    private bool _success = true; 
    public bool Success 
    { 
     get { return _success; } 
     set { _success = value; } 
    } 

    public object Value { get; set; } 
    public List<string> Errors { get; set; } 


    public JsonResultData() 
    { 
     this.Errors = new List<string>(); 
    } 
} 

और फिर तो जैसे JsonResultData आवरण में डेटा या किसी अन्य कॉल मेटा डेटा वापस करने के लिए इसका इस्तेमाल करते हैं:

return new JsonResult { 
      Data = new JsonResultData { Value = returnValue, Success = true } 
      }; 
+1

+1 हमेशा सफलता या त्रुटि के लिए +1, जेएस काम करता है के रूप में वास्तव में आवश्यक रूप से आवश्यक है। –

+2

मुझे नहीं लगता कि यह आपको क्या खरीदता है। वैसे भी सर्वर द्वारा एक http स्थिति हमेशा वापस कर दी जाएगी। आप क्लाइंट को जेसनिंग सीरियलाइज्ड डेटा को जेस्पिंग करने की वकालत कर रहे हैं, भले ही आपको पता चलेगा कि इसे कभी नहीं पढ़ा जाएगा *। क्या बात है? – fearofawhackplanet

+1

ठीक है, सिस्टम-स्तरीय फीडबैक है, और फिर एप्लिकेशन-स्तरीय फीडबैक है। आपके पास एक सफल AJAX निष्पादन हो सकता है, लेकिन आपके एप्लिकेशन के भीतर सर्वर-साइड पर कुछ भी गलत होने पर कोई जानकारी नहीं होगी। – Kon

0

मैं नहीं कर सकता मेरी प्रतिष्ठा के कारण टिप्पणी करें लेकिन मैं अभी भी Kon के जवाब में भ्रम को दूर करने में योगदान देना चाहता हूं।

किसी एप्लिकेशन में मैंने एक्शनमेड के भीतर सभी अपवादों को पकड़ा, एक HttpStatusCode सेट किया और प्रतिक्रिया में एक त्रुटि संदेश जोड़ा। मैंने अजाक्स त्रुटि समारोह में संदेश निकाला और इसे उपयोगकर्ता को दिखाया।

सबकुछ ठीक से काम करता है जब तक कि स्टेजिंग सर्वर पर एप्लिकेशन नहीं लगाया जाता, जिसकी कुछ ऐसी सेटिंग्स थीं जो किसी गलत प्रतिक्रिया के भीतर रिटर्न संदेश की अनुमति नहीं देती थीं। इसके बजाए कुछ मानक एचटीएमएल प्रसारित किए गए जिसके परिणामस्वरूप जेएस त्रुटि प्रतिक्रिया को संसाधित कर रही है।

अंत में मुझे अपने सभी अपवाद हैंडलिंग को फिर से लिखना पड़ा क्योंकि मेरी एप्लिकेशन त्रुटियों को सफल अजाक्स कॉल (जो वास्तव में है) के रूप में लौटा रहा था और फिर अजाक्स सफलता समारोह में भिन्न होता है, वैसे ही यह होना चाहिए।

आपको मिश्रण प्रणाली-स्तर और एप्लिकेशन-स्तरीय फ़ीडबैक नहीं होना चाहिए। आप सिस्टम-स्तरीय फीडबैक को अपने एप्लिकेशन की जरूरत के तरीके को नियंत्रित करने में सक्षम नहीं हो सकते हैं।

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