2010-07-31 13 views
7

Tüm formlarım için yönlendirme sonrası alma modelini kullanıyorum, ancak şimdi kullanıcı deneyimini geliştirmek için AJAX işlevlerini eklemeniz gerekiyor. İlk düşüncelerim ikisinin karışmaması.PRG deseni AJAX form yazılarıyla uyumlu değil mi?

PRG senaryosunda, bir onaylama hatası varsa ya da benim başarımıma yönlendirmek, aksi takdirde işlem gerçekleştirme işlemine geri yönlendirecek bir ileti eylemim olur.

AJAX senaryosunda, her iki tarafa da kısmi bir görünüm vermem gerekiyor. Daha tipik olarak, önce bir AJAX isteğinin olup olmadığını kontrol ederdim. Eğer öyleyse, kısmi görünümü döndür, başka bir deyişle, görünümü döndür.

Herhangi bir fikir veya öneriniz var mı?

cevap

4

Uygulamamızdaki Yönlendirme Sonrası-Get kullanıyoruz. Burada yaptığımız işin özü, Request.IsAjaxRequest() yönteminin etrafına bağlanır ve görünümlerinizi her biri bir .ascx barındıran .aspx'e böler. Böylece, her eylemin hem eşzamanlı hem de eşzamansız olarak (yani Ajax aracılığıyla) çağrılabilir.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Foo foo) 
{ 
    try 
    { 
     // Save the changes to the data store 
     unitOfWork.Foos.Attach(foo); 
     unitOfWork.Commit(); 

     if (Request.IsAjaxRequest()) 
     { 
      // The name of the view for Ajax calls will most likely be different to the normal view name 
      return PartialView("EditSuccessAsync"); 
     } 
     else 
     { 
      return RedirectToAction("EditSuccess"); 
     } 
    } 
    catch (Exception e) 
    { 
     if (Request.IsAjaxRequest()) 
     { 
      // Here you probably want to return part of the normal Edit View 
      return PartialView("EditForm", foo); 
     } 
     else 
     { 
      return View(foo); 
     } 
    } 
} 

Biz de biz özellikle daha ciddi 'istisnalar 'diğerine farklı modeli doğrulama hataları tedavi etmek amacıyla xVal den s (' RulesException yakalamak nerede bu hafif bir varyantı var.

catch (RulesException re) 
{ 
    re.AddModelStateErrors(ModelState, ""); 

    return View(foo); 
} 

Tüm bunlara rağmen, bazen biraz yanlış yaptığımıza dair gizli bir şüphe duyarım.

+0

ajax'ı soyutlaştırmak ... dağınıklığı ortadan kaldırmak için bir temel sınıftaki AjaxView yöntemine mantık. Yaklaşımınız ile ilgili temel sorun, POST eyleminden bir görünüm döndürmenizdir; bu nedenle doğrulama hatası durumunda PRG olmaz. ModelState dışa aktarma ve içe aktarma kullanarak orijinal GET eylemine geri yönlendiriyorum. Asıl sorun, FireFox'un yönlendirme arasındaki ajax bayrağını korumamasıdır, bu yüzden GET işlemimde IsAjaxRequest yanlıştır. Şu anda bu tempdata bayrağı koruyan başka bir eylem filtresi ile çalışmak zorunda. Yine de çok zarif değil. –

3

PRG'nin nedeninin bir kısmı "Formu yeniden göndermek istiyor musunuz?" iletişim. AJAX genellikle bu soruna sahip değildir, çünkü gerçekten 'POST' yapmıyorsunuz (, ama benim sapmamı yakaladınız).

Herzaman, Raylar ne yapmak istediğinizi destekliyor ve bunu kaba bir şekilde ASP.NET MVC'ye çevireceğini düşünmüyorum.

İlk önce, istemci tarafı JavaScript'ine AJAX'ı text/javascript olarak göndermesini söyleyebilirsiniz. JQuery öğesini kullanarak: AJAX çalıştırılmadan önce bir yere koyun. Bu, diğer tüm AJAX çağrılarını etkileyecek, ancak arka uçta aradığınız sürece istenmeyen bir şey yapmamalıdır. Ardından, denetleyicinizde text/javascript başlığına bakın ve buna göre yanıt verin. this article referansı bu SO question göz atın. Daha fazla bilgi verebilseydim, ama şu anda denemek için elimde VS yok.

+2

PRG'nin amacı, AJAX ile ilgili olmayan yinelenen gönderimlerden kaçınmaktır. – Acyra