2011-09-15 18 views
5

içeren kalıcı pencereyi, bir modal pencerede ASP MVC Ajax formu kullanıyorum.Bir webapp içinde ASP MVC Ajax form

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

Bu kod, bir div içine şeklimi (kısmi görünümü) yükler ve kalıcı bir pencere olarak açılır: sadece bazı (yani ShowModal() fonksiyonu) kalıcı penceresini açmak için, herhangi bir özel jQuery kodunu kullanmayın . Formu göndermek ActionResult Ben sadece doğrulamak için varsayılan ModelState nesnesini kullanın ve bir hata durumunda ben model hataları içeren aynı kısmi görünümü döndürür. Bu, aşağıdaki durum haricinde iyi çalışır: modelde hata bulunmadığında, kalıcı pencereyi otomatik olarak kapatmak istiyorum. OnSuccess adı verilecek, böylece

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

, model hataları Ajax çağrısı içeriyor hala geçerli: Aşağıdaki çalıştı. Bunu kısmi görünümde bir HttpStatusCode hatası göndererek çözmeye çalıştım, ancak sonra div yeni html ile güncelleştirilmiyor. Tek çözüm, model hata içermediğinde modal pencereyi kapatan javascript kodu içeren kısmi bir görünüm gönderiyor, ancak bu çözüm benim fikrimde çok düzgün değil. Başka fikirlerin var mı?

cevap

9

Sadece aynı şeyi bugün yapmak zorundaydım. Geldiğim çözüm, işlem başarılı olduğunda JsonResult özelliği true olarak ayarlanmıştı. AjaxOptions'ın OnSuccess geri çağrısında, özelliği kontrol ettim ve modal penceremi kapattım.

Kontrolör Yöntem

[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

Teşekkür Kötü bir deneyin! FYI, satır içi javascript kodunu ör. Unobtrustive açıldığında OnSuccess Chrome'da çalışmaz mı? Bir fonksiyon ismi kullanılarak tespit edilebilir. – Marthijn

+0

Daha fazla tarayıcı testi yapmak zorundayım, ancak şu anda yukarıdaki kod MVC3 kullanarak Chrome 14, IE9 ve FF7'de çalışıyor. MVC2'de inline kodun geri arama için kırıldığını ancak MVC3'te sabitlendiğini belirten bir SO soru gördüm. –

+0

Kodu, satır içi kod yerine bir işlev adı kullanmak üzere güncelledim. Modal'ı birden fazla sayfada kullanmak zorunda kaldım ve DRY kalmasını istedim –