2017-08-28 21 views
7

का उपयोग करते समय मैं एक एएसपीनेट वेबपी नियंत्रक का उपयोग कर रहा हूं, और मेरी प्रोजेक्ट में मेरे पास एक डीएल है जिसे मैंने स्वयं बनाया है। डीएलएल का उपयोग यह सत्यापित करने के लिए किया जा रहा है कि क्या उपयोगकर्ता वास्तव में मौजूद है।AJAX त्रुटि jqXHR.responseText.modelState को वापस नहीं लौटा रहा है कस्टम dll

// POST: api/EventsAPI 
[ResponseType(typeof(Event))] 
public IHttpActionResult PostEvent(Event @event) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if (@event.DateEndOfEvent < @event.DateOfEvent) // successfully returns error.modelState (in view code) 
    { 
     ModelState.AddModelError("DateEndOfEvent", "End Date Cannot Be Before Start Date!"); 
     return BadRequest(ModelState); 
    } 

    if (!EmpData.IsValid(@event.PersonWorkedOne)) // returns error.modelState as undefined (in view code) 
    { 
     ModelState.AddModelError("PersonWorkedOne", "This person does not exist!"); 
     return BadRequest(ModelState); 
    } 

    if (!string.IsNullOrWhiteSpace(@event.PersonWorkedTwo)) 
    { 
     if (!EmpData.IsValid(@event.PersonWorkedTwo)) // returns error.modelState as undefined (in view code) 
     { 
      ModelState.AddModelError("PersonWorkedTwo", "This persondoes not exist!"); 
      return BadRequest(ModelState); 
     } 
    } 

    db.Event.Add(@event); 
    db.SaveChanges(); 

    return CreatedAtRoute("DefaultApi", new { id = @event.Id }, @event); 
} 

अब जब कि उपरोक्त दो सशर्त बयान EmpData है .. EmpData मेरी dll से है:

यहाँ मेरी नियंत्रक तरीका है।

$("form").data("validator").settings.submitHandler = 
    function(form) { 
     $.ajax({ 
      method: "POST", 
      url: infoGetUrl, 
      data: $("form").serialize(), 
      success: function() { 
       toastr.options = { 
        onHidden: function() { 
         window.location.href = newUrl; 
        }, 
        timeOut: 3000 
       } 
       toastr.success("Event successfully created."); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       var status = capitalizeFirstLetter(textStatus); 
       var error = $.parseJSON(jqXHR.responseText); 

       var modelState = error.modelState; 
       console.log(modelState); 
       $.each(modelState, 
        function (key, value) { 
         var id = ""; 
         if (key === "$id") { 
          id = "#" + 
           key.replace('$', '').substr(0, 1).toUpperCase() + 
           key.substr(2); 
         } else { 
          id = "#" + 
           key.replace('$', '').substr(0, 1).toUpperCase() + 
           key.substr(1); 
          var status = capitalizeFirstLetter(textStatus); 
          console.log(key); 

          toastr.error(status + " - " + modelState[key]); 
         } 
         var input = $(id); 
         console.log(id); // result is #id 
         if (input) { // if element exists 
          input.addClass('input-validation-error'); 
         } 
        }); 
      } 
     }); 
    } 

अब, नियंत्रक जब मैं उद्देश्यपूर्ण प्रारंभ तिथि से पहले किया जा रहा है अंतिम तिथि नहीं concering त्रुटि संदेश प्राप्त करने के लिए परीक्षण में, मैं error.modelState प्राप्त करते हैं:

यहाँ मेरे विचार में ajax कोड है। लेकिन जब मैं उद्देश्य से त्रुटि संदेश प्राप्त करने का परीक्षण करता हूं कि एक व्यक्ति मौजूद नहीं है ... मुझे error.modelState नहीं मिलता है .. जो undefined के रूप में लौटाता है।

क्या कस्टम डीएलएल का उपयोग करते समय मॉडलस्टेट वापस काम नहीं करता है?

किसी भी मदद की सराहना की जाती है।

+0

कारण है कि आप प्रत्येक सत्यापन जाँच के भीतर जवाब वापसी करते हैं? इस तरह से कॉलर केवल एक-एक करके, कष्टप्रद रूप से पता लगा सकता है, कौन से फ़ील्ड अमान्य हैं। प्रत्येक 'if' कथन के भीतर मॉडलस्टेट में जोड़ने के लिए यह अधिक कॉलर-अनुकूल होगा, फिर मॉडलस्टेट भी सेट करें। उनके अंदर गलत है और केवल सत्यापन प्रक्रिया के अंत में BadRequest को वापस लौटाएं, यदि ModelState.IsValid गलत है (यानी वहां है कम से कम एक त्रुटि)। फिर यदि एकाधिक फ़ील्ड अमान्य हैं, तो कॉलर उन्हें एक साथ देखेगा। – ADyson

+0

यह आपकी समस्या का एक अधिक परिष्कृत परीक्षण भी अनुमति देगा, जिससे हम दोनों ईवेंट _and_ व्यक्ति फ़ील्ड के लिए अमान्य डेटा भेज सकते हैं, और देख सकते हैं कि क्या आपको अभी भी मॉडलस्टेट वापस मिल रहा है या नहीं। ऐसा कोई कारण नहीं है कि मैं सोच सकता हूं कि पुस्तकालय में कोड क्यों कॉल करना मॉडलस्टेट को प्रकट नहीं करेगा। एक और संभावित स्पष्टीकरण यह है कि EmpData.IsValid सत्य होने पर सत्य लौट रहा है, और आपका कॉल किसी अन्य कारण से विफल रहा है, जो मॉडलस्टेट वापस नहीं करता है। आपको केवल मॉडलस्टेट मिलेगा यदि ए) HTTP स्थिति 400 है और बी) आप वास्तव में प्रतिक्रिया में मॉडलस्टेट भेजते हैं। – ADyson

+0

जब आप किसी अमान्य व्यक्ति का परीक्षण करते हैं, तो क्या HTTP प्रतिक्रिया कोड आप निश्चित रूप से 400 वापस प्राप्त करते हैं? और क्या आपने यह सत्यापित करने के लिए कोड के माध्यम से कदम उठाया है कि यह वास्तव में 'if (! EmpData.IsValid (@ event.PersonWorkedOne)) 'या' if (! EmpData.IsValid (@ event.PersonWorkedTwo))' ब्लॉक, और निश्चित रूप से दर्ज करता है लाइनों को वापस देता है? यदि ऐसा है, तो 'वापसी' कथन पर रोकें और उस समय सर्वर-पक्ष पर मॉडलस्टेट के मान की जांच करें - क्या आप इसकी अपेक्षा करते हैं? और क्या आपने ब्राउजर में वास्तविक प्रतिक्रिया की जांच करने के लिए अपने नेटवर्क टैब की जांच की है, सिर्फ jQuery से आउटपुट नहीं? – ADyson

उत्तर

6

मैं इसे एडिसन की सहायता से समझने में सक्षम था। मैंने अपनी डीएलएल फ़ाइल को केवल एक बूल ऑब्जेक्ट लौटने के लिए संपादित किया।

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

तो अपवाद भाग लेना और केवल सही या गलत काम करना।

मूल

public static bool IsValid(string person) 
{ 
    bool empExists = lstAllEmps.Any(x => x.IDNumber == person); 

    if (empExists) 
    { 
     return empExists; 
    } 
    else 
    { 
     var exceptionMessage = string.Format("The person, {0}, does not exist!", person); 
     throw new ArgumentException(exceptionMessage, person); 
    } 
} 

न्यू

public static bool IsValid(string person) 
{ 
    bool empExists = lstAllEmps.Any(x => x.IDNum == person); 


    return empExists; 
} 
+1

हाँ, अपवाद फेंकने से यह होगा, क्योंकि निष्पादन का सामान्य प्रवाह समाप्त हो जाएगा, और सर्वर शायद 500 आंतरिक सर्वर त्रुटि लौटाएगा। मुझे ख़ुशी है कि तुमने उसे ढूँढ लिया। – ADyson

+2

आपको यह महसूस करना चाहिए कि चूंकि यह "सही" उत्तर है, इसलिए आपका प्रश्न ऑफटॉप है क्योंकि हम कभी यह पता लगाने में सक्षम नहीं थे कि आप अपवाद फेंक रहे हैं। अगली बार, कृपया [एमसीवीई] दिशानिर्देश का पालन करें। –

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