2010-04-14 38 views
11

Ứng dụng MVC của tôi có xu hướng có nhiều cuộc gọi ajax (thông qua JQuery.get()). Đó là loại bugging tôi rằng bộ điều khiển của tôi là rải rác với nhiều phương pháp nhỏ mà được gọi là thông qua ajax. Dường như với tôi là loại phá vỡ mô hình MVC một chút - bộ điều khiển hiện đang trở thành một thành phần truy cập dữ liệu nhiều hơn sau đó là một bộ định tuyến URI.Mẫu điều khiển ASP MVC Ajax?

Tôi đã được cấu trúc lại để tôi có bộ điều khiển 'true' của mình cho một trang chỉ thực hiện các phản hồi định tuyến tiêu chuẩn (truy xuất các đối tượng ActionResponse). Vì vậy, một cuộc gọi đến/home/rõ ràng sẽ khởi động lớp HomeController mà sẽ trả lời trong thời trang điều khiển kinh điển bằng cách trả về một khung nhìn đơn giản.

Sau đó, tôi đã chuyển nội dung ajax của mình vào một lớp điều khiển mới có tên tôi đang mở đầu bằng 'Ajax'. Vì vậy, ví dụ: trang của tôi có thể có ba phần chức năng khác nhau (nói giỏ hàng hoặc tài khoản người dùng). Tôi có một bộ điều khiển ajax cho mỗi điều này (AjaxCartController, AjaxAccountController). Có thực sự không có gì khác nhau về việc di chuyển các công cụ gọi ajax vào lớp điều khiển riêng của nó - nó chỉ là để giữ cho mọi thứ sạch hơn. về phía khách hàng rõ ràng là sau đó JQuery sẽ sử dụng bộ điều khiển mới này:

//jquery pseudocode call to specific controller that just handles ajax calls 
$.get('AjaxAccount/Details'.... 

(1) có mô hình nào tốt hơn trong MVC để trả lời các cuộc gọi ajax không?

(2) Dường như với tôi rằng mô hình MVC hơi bị rò rỉ khi nói đến ajax - nó không thực sự 'kiểm soát' công cụ. Nó chỉ xảy ra là cách tốt nhất và ít đau đớn nhất để xử lý các cuộc gọi ajax (hoặc tôi không biết gì)?

Nói cách khác, sự trừu tượng 'Điều khiển' dường như không phù hợp với Ajax (ít nhất là từ phối cảnh mẫu). Có cái gì tôi đang mất tích?

Trả lời

4

Trong khi bạn có thể đặt Controller vào phần cuối của nó để làm cho công việc kỳ diệu định tuyến của ASP.NET MVC, tôi có xu hướng để làm những gì bạn đã làm - trừ khi tôi đọc AjaxCartController tôi nghĩ tự nhủ AjaxCartPresenter (như trong mẫu Model-View-Presenter thường thấy trong WinForms). Đó là, "bộ điều khiển" này không kiểm soát mà thay vào đó không được gắn kết một cách không được gắn liền với giao diện xem. Tuy nhiên, không giống như chế độ xem, trình điều khiển có thể kiểm tra được.

Khi chúng tôi AJAXify một trang web, chúng tôi sẽ biến nó thành một thứ có thể phản ứng một cách chi tiết, vì vậy các phương pháp tinh vi sẽ không sao. Độ dày hạt là điểm và toàn bộ lý do nó được phát minh. Chúng tôi đang cố ý rời khỏi REST cho một kịch bản cụ thể vì mô hình cụ thể đó không giải quyết được yêu cầu giao diện người dùng trong tay, thay vì chọn một mô hình giống RPC. Chúng chỉ là hoa văn, một cái sẽ không tốt hơn cái kia trong mọi tình huống, ngay cả khi ngăn xếp công nghệ của chúng ta có thể đẩy chúng ta hướng tới cái kia. (Thật vậy, bản thân HTTP hoạt động tốt hơn trong các khối/trang/thực thể/tài liệu chuyển giao trạng thái đại diện.)

Về mặt tinh thần, bạn có thể xem các trang này giống như các biểu mẫu trong ứng dụng WinForms; thực tế là những phương pháp này nằm trong một "bộ điều khiển" chỉ là một tạo tác và nhượng bộ đối với công nghệ đang được sử dụng.(Nếu nó siêu duper làm phiền bạn, bạn có thể cuộn các phương thức AJAX thành IHttpHandler và bỏ qua toàn bộ MVC, nhưng tại sao lại bỏ đi tìm kiếm định tuyến/instantiation/phương pháp tự động và gây khó khăn cho bản thân? tinh khiết nhưng lợi ích đáng ngờ.)

... ít nhất, đó là cách tôi hợp lý hoá nó cho bản thân mình =)

+0

Đồng ý với bạn - về cơ bản chúng tôi có hai loại quyền truy cập 'nội dung' trên web. Mô hình MVC xử lý một cách, và cách khác chúng ta không muốn nói về bởi vì nó không phù hợp với mô hình của chúng ta. Nhưng, ít nhất với tôi, vì ajax là một kỹ thuật hấp dẫn (và ứng dụng hiện tại của tôi gần như hoàn toàn được điều khiển thông qua ajax), mẫu MVC ưa thích thực sự bị phá vỡ và bị tấn công để phản hồi các cuộc gọi ajax (nó hoạt động tốt, tôi có thể thêm). Nó chỉ có vẻ như không có một câu chuyện rất tốt cho ajax trong thế giới MVC. –

0

Nếu bạn có quá nhiều yêu cầu chi tiết, bạn có thể muốn có một phương thức Hành động điều khiển để phục vụ tất cả các cuộc gọi. Bạn có thể sử dụng một 'chuyển' trong phương pháp để xác định loại cuộc gọi và dịch vụ nó cho phù hợp thay vì có một tỷ phương pháp nhỏ. Bạn thậm chí có thể sử dụng hằng số chuỗi rõ ràng thay vì số cho biến chuyển đổi.

+0

sử dụng câu lệnh chuyển dường như không giúp tôi. Nếu bất cứ điều gì nó làm cho nó tồi tệ hơn ... có lẽ tôi không nhận được quan điểm của bạn? –

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