का उपयोग करते समय मैं एक एएसपीनेट वेबपी नियंत्रक का उपयोग कर रहा हूं, और मेरी प्रोजेक्ट में मेरे पास एक डीएल है जिसे मैंने स्वयं बनाया है। डीएलएल का उपयोग यह सत्यापित करने के लिए किया जा रहा है कि क्या उपयोगकर्ता वास्तव में मौजूद है।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
के रूप में लौटाता है।
क्या कस्टम डीएलएल का उपयोग करते समय मॉडलस्टेट वापस काम नहीं करता है?
किसी भी मदद की सराहना की जाती है।
कारण है कि आप प्रत्येक सत्यापन जाँच के भीतर जवाब वापसी करते हैं? इस तरह से कॉलर केवल एक-एक करके, कष्टप्रद रूप से पता लगा सकता है, कौन से फ़ील्ड अमान्य हैं। प्रत्येक 'if' कथन के भीतर मॉडलस्टेट में जोड़ने के लिए यह अधिक कॉलर-अनुकूल होगा, फिर मॉडलस्टेट भी सेट करें। उनके अंदर गलत है और केवल सत्यापन प्रक्रिया के अंत में BadRequest को वापस लौटाएं, यदि ModelState.IsValid गलत है (यानी वहां है कम से कम एक त्रुटि)। फिर यदि एकाधिक फ़ील्ड अमान्य हैं, तो कॉलर उन्हें एक साथ देखेगा। – ADyson
यह आपकी समस्या का एक अधिक परिष्कृत परीक्षण भी अनुमति देगा, जिससे हम दोनों ईवेंट _and_ व्यक्ति फ़ील्ड के लिए अमान्य डेटा भेज सकते हैं, और देख सकते हैं कि क्या आपको अभी भी मॉडलस्टेट वापस मिल रहा है या नहीं। ऐसा कोई कारण नहीं है कि मैं सोच सकता हूं कि पुस्तकालय में कोड क्यों कॉल करना मॉडलस्टेट को प्रकट नहीं करेगा। एक और संभावित स्पष्टीकरण यह है कि EmpData.IsValid सत्य होने पर सत्य लौट रहा है, और आपका कॉल किसी अन्य कारण से विफल रहा है, जो मॉडलस्टेट वापस नहीं करता है। आपको केवल मॉडलस्टेट मिलेगा यदि ए) HTTP स्थिति 400 है और बी) आप वास्तव में प्रतिक्रिया में मॉडलस्टेट भेजते हैं। – ADyson
जब आप किसी अमान्य व्यक्ति का परीक्षण करते हैं, तो क्या HTTP प्रतिक्रिया कोड आप निश्चित रूप से 400 वापस प्राप्त करते हैं? और क्या आपने यह सत्यापित करने के लिए कोड के माध्यम से कदम उठाया है कि यह वास्तव में 'if (! EmpData.IsValid (@ event.PersonWorkedOne)) 'या' if (! EmpData.IsValid (@ event.PersonWorkedTwo))' ब्लॉक, और निश्चित रूप से दर्ज करता है लाइनों को वापस देता है? यदि ऐसा है, तो 'वापसी' कथन पर रोकें और उस समय सर्वर-पक्ष पर मॉडलस्टेट के मान की जांच करें - क्या आप इसकी अपेक्षा करते हैं? और क्या आपने ब्राउजर में वास्तविक प्रतिक्रिया की जांच करने के लिए अपने नेटवर्क टैब की जांच की है, सिर्फ jQuery से आउटपुट नहीं? – ADyson