2011-09-15 7 views
5

युक्त मोडल विंडो बंद करें मैं एक मॉडल विंडो में एएसपी एमवीसी अजाक्स फॉर्म का उपयोग कर रहा हूं। मैं किसी भी विशिष्ट jQuery कोड का उपयोग नहीं करते, केवल कुछ मोडल विंडो खोलने के लिए (यानी showModal() फंक्शन):एक वेबपैप में एएसपी एमवीसी अजाक्स फॉर्म

@Ajax.ActionLink("Open", "Add", "Home", new {id = Model.Id}, new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "modal", OnSuccess = "showModal()"}) 

इस कोड को एक div में मेरी फार्म (आंशिक दृश्य) लोड करता है और मोडल विंडो के रूप में यह खोलता है । फॉर्म में ActionResult सबमिट करें मैं इसे सत्यापित करने के लिए डिफ़ॉल्ट मॉडलस्टेट ऑब्जेक्ट का उपयोग करता हूं, और किसी त्रुटि के मामले में मैं मॉडल त्रुटियों वाले समान आंशिक दृश्य को वापस करता हूं। यह निम्न स्थितियों को छोड़कर ठीक काम करता है: जब मॉडल में कोई त्रुटि नहीं होती है तो मैं मोडल विंडो को स्वतः बंद करना चाहता हूं। मैंने निम्नलिखित कोशिश की:

@using (Ajax.BeginForm("Save", "Home", new AjaxOptions {HttpMethod = "POST", UpdateTargetId = "modal", OnSuccess = "hideModal(); alert('Saved');"})) 

हालांकि, जब मॉडल में त्रुटियां होती हैं तो अजाक्स कॉल अभी भी वैध है, इसलिए ऑनस्यूवर को बुलाया जाएगा। मैंने आंशिक दृश्य में एक त्रुटि HttpStatusCode भेजकर इसे हल करने का प्रयास किया, लेकिन तब div को नए HTML के साथ अपडेट नहीं किया गया है। मुझे लगता है कि एकमात्र समाधान आंशिक दृश्य भेज रहा है जिसमें जावास्क्रिप्ट कोड है जो मॉडेल विंडो को बंद करता है जब मॉडल में कोई त्रुटि नहीं होती है, लेकिन यह समाधान मेरी राय में बहुत साफ नहीं है। कोई अन्य विचार?

उत्तर

9

मुझे आज भी वही करना था। जिस समाधान के साथ मैं आया था, वह कार्रवाई के सफल होने पर एक संपत्ति सेट के साथ एक JsonResult वापस करने के लिए था। AjaxOptions के ऑनस्यूप कॉलबैक में मैंने संपत्ति के लिए चेक किया और मेरी मोडल विंडो बंद कर दी।

नियंत्रक विधि

[HttpPost] 
public ActionResult Hold(JobStatusNoteViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //do work 
     return Json(new {success = true}); 
    } 

    return PartialView("JobStatusNote", model); 
} 

PartialView

<% using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "JobStatusForm", OnSuccess = "closePopUp" })) { %> 
<div id="JobStatusForm"> 
    <!-- Form --> 
</div> 
<% } %> 

<script> 
function closePopUp(data) { 
if (data.success) { 
    //close popup 
    } 
} 
</script> 
+0

धन्यवाद बीमार उसे आज़माएं! एफवाईआई, क्या आपने इनलाइन जावास्क्रिप्ट कोड डालने पर ध्यान दिया है जब Unobtrusive चालू होता है तो OnSuccess क्रोम में काम नहीं करता है? इसे फ़ंक्शन नाम का उपयोग करके ठीक किया जा सकता है। – Marthijn

+0

मुझे और ब्राउज़र परीक्षण करना होगा, लेकिन अभी उपर्युक्त कोड एमवीसी 3 का उपयोग कर क्रोम 14, आईई 9 और एफएफ 7 में काम करता है। मैंने एक एसओ सवाल देखा है कि कॉलबैक के लिए एमवीसी 2 में इनलाइन कोड टूटा गया था लेकिन एमवीसी 3 में तय किया गया था। –

+0

मैंने इनलाइन कोड की बजाय फ़ंक्शन नाम का उपयोग करने के लिए कोड अपडेट किया। मुझे एक से अधिक पेज पर मोडल का उपयोग करना पड़ा और चाहता था कि वह डीआरवाई रहे –