2011-09-07 14 views
13

मेरे पास "प्रतिक्रिया सबमिट करें" फ़ॉर्म है जो "अजाक्स.बजिनफॉर्म" का उपयोग करता है ताकि फॉर्म तत्वों को आंशिक रूप से प्रस्तुत किया जा सके। ऑनस्ट्यूशन इवेंट ट्रिगर हो रहा है भले ही मॉडलस्टेट मान्य न हो। क्या यह सामान्य है? मैं कुछ पोस्टबैक करने में सक्षम होने की उम्मीद कर रहा था जिसके परिणामस्वरूप एक अवैध मॉडल था, फिर जब मॉडल मान्य है और कोई त्रुटि नहीं है तो ऑनस्यूफ इवेंट ट्रिगर होगा?एएसपी.नेट एमवीसी "अजाक्स.बिनगोरफॉर्म" ऑनस्यूफ को निष्पादित करता है भले ही मॉडल वैध नहीं है

+0

मैं मानता हूँ कि यह बेकार में साथ काम करने के जटिल है। हमें स्पष्ट रूप से एक साधारण मूल्य की आवश्यकता है जो इंगित करता है कि मॉडल मान्य है या नहीं। –

उत्तर

17

क्या यह सामान्य है?

हां, ज़ाहिर है। यदि सर्वर HTTP 200 भेजता है तो ऑनस्यूप विधि कहा जाता है। मॉडलस्टेट वैधता की धारणा केवल सर्वर पक्ष है। जब तक आपका नियंत्रक कार्रवाई कुछ दृश्य/आंशिक/जेसन/... लौटाता है, तो ऑनस्यूवर ट्रिगर होगा। यदि आपके नियंत्रक कार्रवाई के अंदर कोई अपवाद फेंक दिया गया है तो OnSrror को OnSuccess के बजाय ट्रिगर किया जाएगा।

[HttpPost] 
public ActionResult Process(MyViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Json(new { success = false }); 
    } 
    return Json(new { success = true }); 
} 

और उसके बाद:

function success(result) { 
    if (result.success) { 
     // the model was valid 
    } else { 
     // the model was invalid 
    } 
} 
अब अवैध मॉडल आप हो सकता है के मामले में

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

function success(result) { 
    if (result.success) { 
     // the model was valid 
    } else { 
     // there were errors => show them 
     $('#myform_container').html(result); 
     // if you are using client side validation you might also need 
     // to take a look at the following article 
     // http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx 
     // and reattach the client validators to the form as you are 
     // refreshing its DOM contents here 
    } 
} 
+4

धन्यवाद धन्यवाद। यह जवाब सही है। मुझे आश्चर्य है कि इस परिदृश्य (मॉडल त्रुटियों) को अविभाज्य AJAX सामान के साथ संभालने पर ठोस दस्तावेज नहीं है। –

+1

मेरे लिए काम नहीं करता है क्योंकि, विफलता पर, मुझे एक दृश्य वापस करना होगा, न कि JSON। – Misi

+0

मुझे लगता है कि आपको पहले परिणाम के प्रकार की जांच करनी होगी: यदि (टाइपऑफ (परिणाम) == "ऑब्जेक्ट" && result.success) { – Misi

25

मैं एक काफी सरल जावास्क्रिप्ट तकनीक के साथ इस मुद्दे को संभालने:

पहले सेटअप अपने OnSuccess इस तरह:

OnSuccess = "UpdateSuccessful(data)" 
फिर

अपने जावास्क्रिप्ट समारोह की तरह यह:

function UpdateSuccessful(data) { 
    if (data.indexOf("field-validation-error") > -1) return; 

    // Do your valid stuff here 
} 

इस तरह, गड़बड़ी की कोई आवश्यकता नहीं है अपने नियंत्रक, या अधिक महत्वपूर्ण ith, अपने नियंत्रक यानी अजीब कुछ भी करने के बिना मॉडल त्रुटियों के साथ Partial View लौट सकते हैं,:

public ActionResult SaveDetails(Project model) 
    { 
     if (ModelState.IsValid) 
     { 
      model.SaveProject(); 
     } 

     return PartialView("ProjectForm", model); 
    } 

और अपने AjaxOptions में:

UpdateTargetId = "FormContents" 

अब बस सुनिश्चित करें कि आपके div या id="FormContents" के साथ कुछ भी जहां भी आप अपना फॉर्म प्रदर्शित करना चाहते हैं। लुइस 'जवाब पर

var OnSuccess = function() { 
    if ($(".validation-summary-errors").length == 0) { 
     //Your javascript/jquery code goes here 
    } 
} 
+1

'ऑनस्यूप =" अपडेट असफल (डेटा) "': वास्तव में सहायक। धन्यवाद। –

+0

क्या यह ** 'डेटा' ** ऑब्जेक्ट सभी ब्राउज़रों पर काम करता है? क्या इसमें कोई सीमाएं या संगतता समस्याएं हैं? –

+0

यह जावास्क्रिप्ट सक्षम होने वाले सभी ब्राउज़रों पर काम करना चाहिए। –

3

आप निम्न कर सकते हैं

function OnSuccess() { 
    if ($("span[class='field-validation-error']").length == 0) { 
     alert("Target Platform saved Successfully."); 
    } 
} 
1

मामूली बदलाव:

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