2010-07-31 27 views
7

Tôi đang sử dụng mẫu chuyển hướng sau khi chuyển hướng cho tất cả các biểu mẫu của mình, nhưng bây giờ cần thêm chức năng AJAX để cải thiện trải nghiệm người dùng. Suy nghĩ ban đầu của tôi là hai người không trộn lẫn.Mẫu PRG có tương thích với các bài đăng biểu mẫu AJAX không?

Trong kịch bản PRG, tôi sẽ có hành động đăng bài của mình sau đó sẽ chuyển hướng trở lại hành động của tôi nếu có lỗi xác thực hoặc chuyển hướng đến thành công của tôi.

Trong trường hợp AJAX, tôi cần trả lại một phần xem theo một trong hai cách. Thông thường, tôi sẽ kiểm tra xem nó có phải là một yêu cầu AJAX trước không. Nếu vậy, hãy trả lại một phần xem, nếu không sẽ trả lại khung nhìn.

Bất kỳ suy nghĩ hoặc đề xuất nào?

Trả lời

4

Chúng tôi sử dụng Post-Redirect-Get trong ứng dụng của chúng tôi. Dưới đây là bản chất của những gì chúng tôi làm, mà bản lề xung quanh phương pháp Request.IsAjaxRequest() và chia các quan điểm của bạn thành .aspx mỗi cái lưu trữ một .ascx để mỗi hành động có thể được gọi là đồng bộ và không đồng bộ (tức là thông qua Ajax).

[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); 
     } 
    } 
} 

Chúng tôi có một biến thể nhẹ về vấn đề này cũng nơi chúng tôi đặc biệt bắt RulesException 's (từ xVal để đối xử với lỗi mô hình xác nhận khác nhau để khác 'ngoại lệ nghiêm trọng hơn'.

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

    return View(foo); 
} 

Nói tất cả những điều đó, mặc dù đôi khi tôi nhận được một sự nghi ngờ lén lút rằng chúng tôi có thể làm điều đó hơi sai.

+0

Bạn có thể trừu tượng hóa if ajax ... thành một phương thức AjaxView trong một lớp cơ sở để loại bỏ sự lộn xộn. Vấn đề chính với cách tiếp cận của bạn là bạn đang trả về một khung nhìn từ hành động POST vì vậy nó không phải là PRG trong trường hợp thất bại xác nhận. Tôi chuyển hướng trở lại hành động GET ban đầu, bằng cách sử dụng một xuất khẩu và nhập khẩu của ModelState. Vấn đề chính là FireFox không bảo vệ cờ ajax giữa các chuyển hướng, vì vậy trong hành động GET của tôi, IsAjaxRequest là sai. Tôi hiện đang phải làm việc xung quanh điều này với một bộ lọc hành động mà giữ lá cờ để tempdata. Không phải là rất thanh lịch mặc dù. –

3

Vâng, một phần lý do cho PRG là tránh "Bạn có muốn gửi lại biểu mẫu không?" hộp thoại. AJAX thường không có vấn đề này, vì bạn không phải là thực sự đang thực hiện 'POST' (bạn , nhưng bạn bắt được sự trôi dạt của mình).

Anyways, Rails hỗ trợ những gì bạn muốn làm, và tôi không nghĩ rằng nó sẽ được thô dịch nó để ASP.NET MVC.

Trước tiên, bạn có thể yêu cầu JavaScript phía máy khách của mình gửi AJAX là text/javascript. Sử dụng jQuery:

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript"); } 
}); 

Đặt địa điểm đó trước khi AJAX chạy. Điều này sẽ ảnh hưởng đến tất cả các cuộc gọi AJAX khác, nhưng không nên làm bất cứ điều gì ngoài ý muốn trừ khi bạn đang tìm kiếm nó trên chương trình phụ trợ.

Sau đó, trong bộ điều khiển của bạn, hãy tìm tiêu đề text/javascript và phản hồi tương ứng. Kiểm tra này SO question, tham chiếu this article. Ước gì tôi có thể cung cấp thêm thông tin, nhưng tôi không có VS tiện dụng để dùng thử ngay bây giờ.

+2

Điểm tốt về mục đích của PRG là về tránh trùng lặp gửi, mà không quan trọng với AJAX – Acyra

Các vấn đề liên quan