2008-10-17 25 views
8

Trước khi trả lời, câu hỏi này rất phức tạp:Tách mặt lôgic khách hàng từ phía máy chủ logic trong một cách tái sử dụng sử dụng MVC

  1. Chúng tôi đang phát triển trong asp.net/asp.net MVC/jQuery nhưng tôi mở cho các giải pháp trên bất kỳ nền tảng nào sử dụng khung bất kỳ
  2. Tôi nghĩ rằng logic như sắp xếp/ẩn cột/sắp xếp lại cột/xác thực (ở vị trí hợp lý) phải ở phía máy khách
  3. Tôi nghĩ logic như tìm kiếm/cập nhật luồng công việc db/đang chạy phải ở phía máy chủ (chỉ vì lý do bảo mật/gỡ lỗi)

Điều chúng tôi đang cố gắng làm là KHÔNG TẠO MESS trong giao diện người dùng của chúng tôi bằng cách viết một loạt JavaScript để xử lý cùng tính năng trong các ngữ cảnh khác nhau. Tôi hiểu rằng tôi có thể sử dụng một tệp JavaScript + JavaScript hướng đối tượng, tôi đang tìm mẫu làm cho nó dễ dàng hơn nhiều.

Một giải pháp được đề xuất là có mô hình MVC ở cả phía máy khách và máy chủ, nơi chúng tôi có thể đóng gói chức năng JavaScript trong các bộ điều khiển phía khách, sau đó sử dụng chúng ở các phần khác nhau của trang web. Tuy nhiên, điều này có nghĩa là chúng tôi có 2 triển khai MVC!

Đây có phải là quá mức cần thiết không? Làm thế nào bạn sẽ mở rộng về giải pháp này? Có những giải pháp nào khác?

Trả lời

2

Trên hai; bạn phải luôn có xác thực phía máy chủ cũng như xác thực bên ứng dụng khách

Trên ba; nếu bạn có thể tìm cách để thao tác DB ở phía máy khách sẽ ấn tượng;)

Tôi không biết ASP.net hoạt động như thế nào, vì vậy tôi chỉ nói từ kinh nghiệm PHP của tôi.

Tôi sẽ viết các điều khiển được ghép nối với mã máy chủ và máy khách. Mỗi điều khiển cần một biểu mẫu, logic phía máy khách và logic phía máy chủ. Biểu mẫu được viết bởi công cụ tạo khuôn mẫu của bạn, logic phía máy khách được gắn vào biểu mẫu và được viết bằng JS và logic bên máy chủ là một cặp điều khiển/hành động ở đâu đó thao tác mô hình. Rõ ràng, bạn sẽ không muốn ghép nối logic phía khách hàng của bạn với một hành động/bộ điều khiển cụ thể, do đó hãy chắc chắn xác định một giao diện có thể được sử dụng để nói chuyện với điều khiển của bạn ...

Sau đó, cho mỗi biểu mẫu tôi sẽ viết một lớp trong javascript thể hiện các điều khiển của bạn. Ví dụ; bạn có thể có quyền kiểm soát:

{include file = "list_view.php" id = "ListView1" data = $Data.List} 

sẽ in biểu mẫu của bạn. Sau đó, trong lớp điều khiển trang của bạn:

this.ListView1 = new ListViewController({id : "ListView1", serverCtrl : "Users"}); 

Bây giờ bạn có thể sử dụng "this.ListView1" để thao tác chế độ xem danh sách. Trình điều khiển danh sách xem thực hiện các công cụ như tạo truy vấn AJAX cho các trang mới nếu sử dụng nhấn nút trang tiếp theo - và cũng xử lý các cột và sắp xếp (cũng sẽ ủy nhiệm cho máy chủ).

+0

Tôi thích ý tưởng ở đây - về cơ bản một cách tiếp cận đơn giản, điều duy nhất tôi đã cố gắng tránh là rất nhiều "dây nó lên", nơi các phương pháp javascript trên giao diện điều khiển chỉ đơn giản là giao cho logic phía máy chủ. Tuy nhiên, nó có thể chỉ là thứ mà tôi không thể tránh được. Cảm ơn! –

+4

Có các khung công tác JavaScript cho phép bạn truy cập DB. Làm điều này tương tự như việc sử dụng ASP.NET Data Controls, nhưng không có khả năng mở rộng. Số lượng JavaScript bạn sẽ phải sử dụng để đến với một cấy ghép khả năng mở rộng nó sẽ chỉ đi xuống đến lý do tại sao? C#, LINQ, EF/các ORM khác ánh sáng nhiều năm trước JavaScript. PHP và ASP.NET MVC là hai thế giới phát triển khác nhau. Ngoài ra trong ASP.NET MVC chúng tôi không có điều khiển. Chúng tôi gần gũi hơn với phía khách hàng và JavaScript nên cách tiếp cận của bạn thay đổi và mang đến cho bạn nhiều tự do hơn. – LCarter

-1

... Tùy theo ...Trên thực tế, những điều tốt nhất là phát triển giao diện người dùng bằng cách sử dụng css/javascript/html cho kiểu dữ liệu /hành vi/dữ liệu +, trong những ngày này mọi người muốn tương tác ajax (họ thấy rằng họ không phải tải lại toàn bộ trang mỗi lần) nên tôi nghĩ bạn nên cân nhắc điều này. BTW MVC kết thúc khi nội dung của bạn được phân phát và không phải là nội dung HTML, bạn có thể phục vụ xml hoặc json trong Chế độ xem của mình.

ASP.NET MVC cho phép trả lại nội dung ("TEXT") để bạn có thể sắp xếp lại kết thúc bằng MVC và tương tác người dùng/hành vi trong javascript, ví dụ như khi cuộc gọi ajax được gửi đến máy chủ bạn đang gọi phần điều khiển của ứng dụng của bạn, vì vậy bạn có thể gọi một hành động Ajax chuyển sang mô hình ajax hiển thị dưới dạng JSON và quay lại phần JS của giao diện người dùng của bạn (Phần hành vi).

Vì phần Hành vi được xác định trong phần Xem của bạn (Chế độ xem ban đầu bao gồm CSS/HTML JS) miễn là một phần trình bày Tôi nghĩ bạn chưa phá vỡ các mẫu MVC.

PS. Tôi đã quên nói rằng rõ ràng là các hành động DB ở lại trong mô hình của bạn (bạn có thể nghĩ ở mô hình là nơi Lớp Truy cập Dữ liệu + Lớp Đối tượng Kinh doanh ở lại)

+0

Có lẽ tôi nên lặp lại câu hỏi, vấn đề thực sự của tôi là MVC _does not_ kết thúc khi nội dung của tôi được phục vụ và tôi không thể nghĩ ra lý do. Tôi đang cố gắng kết hợp AJAXY đó với một cơ sở mã có cấu trúc sạch sẽ không chỉ ủy nhiệm mọi hành động trở lại máy chủ. –

+0

Điều tôi muốn nói là trong MVC "cổ điển", Hành động sẽ kết thúc khi nội dung được phân phát. Cố gắng nhân đôi mẫu MVC trong View, theo ý kiến ​​của tôi, đã phá vỡ logic MVC vì bạn đã có 2 bộ điều khiển, và đây không phải là cách tốt nhất để hành động, bạn đang thêm độ phức tạp và có thể ghép nối với quan điểm – kentaromiura

3

Tôi chỉ cần googled cái này để lấy nó bằng một hạt muối. JavascriptMVC tuyên bố là một khung MVC. Một lần nữa, tôi không có kinh nghiệm với nó nhưng nó có thể đáng xem.

+1

Thats a liên kết tuyệt vời! Tôi chưa chơi với nó nhưng nó trông giống như thứ gì đó có thể giúp được. –

1

Nếu bạn đang sử dụng MVC, thì tôi cho rằng chế độ xem của bạn sử dụng công cụ mẫu. Mỗi trang được liên kết với một mẫu và mỗi mẫu thường chứa tham chiếu đến một hoặc nhiều tập lệnh. Câu hỏi là, các tập lệnh của bạn được tham chiếu như thế nào trong mẫu? Chúng có tĩnh hay chúng năng động? Trong bộ điều khiển của bạn, bạn nên có tùy chọn để bao gồm bất kỳ tập lệnh nào trong chế độ xem được sử dụng cho trang bất kể mẫu. Tôi thường đề nghị phương pháp "bao gồm nó khi cần thiết" bởi vì mô phỏng phía máy khách MVC có nghĩa là chính xác những gì bạn đã nói - nghĩa là bạn có hai khung công tác MVC để duy trì. Không chỉ vậy - với hầu hết các mô hình phía máy khách, chúng có quyền truy cập trực tiếp vào mô hình phía máy chủ của bạn, đánh bại mục đích của MVC phía máy chủ của bạn. Bây giờ bạn đang bỏ qua hoàn toàn bộ điều khiển.

Khi nói đến JavaScript, điều tốt nhất cần làm là giữ cho nó rất đơn giản. Với jQuery, bạn có cơ hội tốt hơn để thực hiện điều này. Mỗi trang đều lấy lõi và bạn có một số tệp JavaScript khác trong cùng một thư mục, mỗi tệp là một plugin hoặc phần mở rộng của đối tượng jQuery ánh xạ tới chức năng rất cụ thể. Nếu các nhà phát triển muốn biết liệu chức năng đã tồn tại chưa, tất cả những gì bạn làm là kiểm tra hệ thống tệp nơi các tệp JavaScript được đặt. Nếu plugin tồn tại, hãy đưa nó vào bộ điều khiển của bạn để sử dụng trong một trang. Bằng cách này, bạn có thể xây dựng những người trợ giúp ở phía máy chủ nằm giữa ứng dụng phía máy khách của bạn và bất kỳ bộ điều khiển hiện có nào. Trình trợ giúp dành riêng cho chức năng và plugin đó, và bạn không mở truy cập chăn đến các mô hình của mình từ phía máy khách.

3

Giữ đơn giản. Xây dựng ứng dụng của bạn để có đầy đủ chức năng trong khuôn khổ MVC ASP.Net. Không yêu cầu JavaScript ở giai đoạn thử nghiệm này.

Bây giờ, hãy thêm những thứ đẹp bằng cách liên kết jQuery trong site.master (liên kết Google) và ở cuối Chế độ xem yêu cầu trải nghiệm web 2.0, liên kết đến các tệp JS thích hợp bổ sung chức năng kín đáo. Tắt JS và ứng dụng của bạn sẽ giảm trở lại bước trước đó.

Ví dụ: bạn muốn thêm xác thực phía máy khách ngoài phía máy chủ.Tệp JS sẽ đính kèm một trình xử lý sự kiện vào các biểu mẫu gửi đi. Trình xử lý sau đó sẽ sử dụng một đối tượng đã được tạo ra bởi máy chủ (cùng một đối tượng được sử dụng để xác thực máy chủ), nó sẽ là đối tượng JSON tốt nhất vì nó tương thích với JS và ASP.NET. Các thành viên của đối tượng sẽ là các quy tắc để kiểm tra và thông báo lỗi để ghi vào DOM tại cùng một vị trí mà bạn đã chọn cho các lỗi phía máy chủ. Người xử lý của bạn trả về false cho đến khi tất cả đều hợp lệ và đúng khi chính xác.

Bạn muốn có một tính năng ưa thích thú vị, chẳng hạn như chế độ xem hộp đèn của ảnh. Thêm plugin cho chế độ xem của bạn, sửa đổi đánh dấu <ul id="lightup"> ..., thêm mã:

 
$(function() { 
    $(#lightup).showit(400); // or something like that 
}); 

và tốt để sử dụng.

Cố gắng tách biệt chức năng chia sẻ khỏi mã máy chủ thành dịch vụ web hoặc trang để cả khách hàng, thông qua XHR và máy chủ, có thể chia sẻ cùng một chức năng/dữ liệu.

+0

Câu trả lời hay. Cảm ơn bạn đã dành thời gian cho một câu hỏi cũ. –

1

không trả lại json/xml để xem và xây dựng chúng với thế hệ dom jquery trên máy khách. It's ok hiệu suất khôn ngoan trên máy phong nha, nhưng tôi đã thực hiện sai lầm này và khi cố gắng để xem các trang web với iphone của tôi phải mất 60 giây để tải ... và tôi là người duy nhất trên trang web! :-)

vì vậy tại thời điểm này, tôi chỉ sử dụng phép phun jquery dom để cập nhật ajaxy và không hiển thị toàn bộ trang.

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