2009-02-10 41 views

Trả lời

2

Tôi không nghĩ có một thứ như "di chuyển từng bước" từ ASP.NET WebForms sang ASP.NET MVC. Chúng là hai mẫu thiết kế hoàn toàn khác nhau được xây dựng trên cùng một khuôn khổ, nhưng có rất nhiều thứ không chỉ cần di chuyển mà được thiết kế lại hoàn toàn, nếu bạn không chỉ muốn xây dựng một trang web ứng dụng trên dự án mẫu MVC thay vì mẫu WebForms.

Lý do chính cho việc này là tách mối quan tâm, điều này chặt chẽ hơn trong MVC so với trong WebForms. Tôi hiện đang làm việc (tốt, tôi nên ...) về việc di chuyển một dự án sở thích cũ và khá lỗi từ WebForms sang MVC và cách tiếp cận của tôi về cơ bản là "xem xét chức năng, xây dựng lại nó từ đầu." Tất nhiên tôi đã có một số phương pháp trợ giúp cho định dạng đầu ra vv mà tôi chỉ đưa vào dự án mới của tôi, nhưng hầu hết những thứ cơ bản tôi đã chọn chỉ để làm lại hoàn toàn. Bạn sẽ ngạc nhiên rằng tôi phải mất bao nhiêu thời gian để đạt được mục tiêu tương tự với MVC, rằng tôi đã thiết lập ứng dụng WebForms một năm rưỡi trước - với việc sử dụng Entity Framework, jQuery và các công cụ ngọt khác, bạn sẽ có thể tạo ra kết quả trong vòng vài giờ.

+0

Hải Tomas, Cảm ơn câu trả lời của bạn. Nhưng tôi không thể hiểu rõ. Tôi nên làm gì để di chuyển? –

+2

Vâng, điều này là - như tôi đã nói trong câu đầu tiên của tôi - có _is_ không có cách nào dễ dàng di chuyển. Nếu bạn tin rằng MVC là mẫu phù hợp cho ứng dụng của bạn để bắt đầu, tôi khuyên bạn nên xây dựng lại cùng một tính năng từ đầu - nếu không bạn sẽ không thực sự theo dõi mẫu. –

1

Câu trả lời của tôi là "Bạn không" :). Nếu bạn thực sự muốn làm điều này, bạn có thể sử dụng trang asp.net hiện tại làm mục tiêu cuối cùng của bạn, hoặc như một yêu cầu 'tài liệu'. Và có thể bạn có thể sử dụng datalayer trong mô hình của bạn, nhưng bạn sẽ phải thiết kế lại toàn bộ trang web.

Như Tomas đã chỉ ra, nó rất khác với asp.net cổ điển.

65

Đây là hướng dẫn từng bước của tôi, dựa trên các bước chúng tôi đã thực hiện tại công ty của mình trong khi di chuyển từ ASP.Net Webforms sang ASP.Net MVC. Nó không hoàn hảo, và vẫn đang tiếp tục vì chúng ta phải làm điều này theo từng giai đoạn vì kích thước của trang web, nhưng có lẽ ai đó sẽ tìm và trả lời câu trả lời dựa trên kết quả của chúng tôi.

Giai đoạn: 1. Lập kế hoạch - chuyển sang MVC từ Biểu mẫu web trong ASP.Net yêu cầu một số quy hoạch cẩn thận. Sai lầm chúng tôi thực hiện trong động thái của chúng tôi là không nhận ra rằng có hai khía cạnh thực sự trong giai đoạn lập kế hoạch này, lập kế hoạch tuyến đường và lập kế hoạch mô hình/bộ điều khiển/hành động. Không thực hiện việc này sẽ gây ra các sự cố nghiêm trọng sau này khi bạn cố gắng mở rộng chức năng của trang web của mình hoặc truy cập các di chuyển phức tạp hơn.

Mẹo: - Xem sơ đồ trang web hiện tại của bạn và thiết kế cấu trúc thư mục/sơ đồ trang web được cải tiến để sử dụng trong ứng dụng ASP.Net MVC. Tìm ra 'ngôn ngữ' cho trang web của bạn, ví dụ: hành vi mặc định của ASP.Net MVC là có hành vi http://sitename/ {controller}/{action}/{id}, nhưng bạn có thể ghi đè lên điều này khi bạn có được nhiều quy tắc định tuyến hacking kinh nghiệm hơn.

  • Nhớ theo mặc định, mỗi Bộ điều khiển sẽ được định tuyến đến qua thư mục con ảo của ứng dụng của bạn, ví dụ: http://sitename/X sẽ định tuyến đến XController (và theo mặc định là phương pháp chỉ mục của nó), http://sitename/Y/Get sẽ định tuyến đến phương thức Get() của YController. Bạn có thể thay đổi điều này theo ý bạn (định tuyến thực sự mạnh mẽ), nhưng điều đó vượt ra ngoài phạm vi của câu trả lời này.

  • Sử dụng sơ đồ trang web hiện có, chỉ định thư mục nào trong cấu trúc MVC mỗi trang .aspx hiện tại sẽ rơi (dĩ nhiên, trước tiên hãy hỏi xem trang đó có tồn tại không).

  • Nếu Tập lệnh, Hình ảnh v.v. không được lưu trữ cùng nhau hoặc trong một số thư mục 'tên riêng' trong mỗi thư mục con, hãy xem xét thực hiện việc này ngay khi bạn thiết kế lại. Điều này là vì nó sẽ đơn giản hóa rất nhiều thiết kế của bạn bằng cách cho phép bạn sử dụng lệnh quy tắc định tuyến Map.IgnoreRoute() trong tệp Global.aspx.cs để bỏ qua việc xử lý các thư mục này dưới dạng tuyến đường.

Trong trường hợp của chúng tôi, chúng tôi nhân đôi bố cục thư mục con thực sự của trang web hiện tại, nơi mỗi thư mục con trở thành bộ điều khiển, ví dụ:/Tài khoản sẽ có một AccountController,/X sẽ có XController. Tất cả các trang nằm trong đó đều được thay thế bằng các hành động trong mỗi Bộ điều khiển. ví dụ. http://sitename/profile/about.aspx giờ đã trở thành http://sitename/profile/about và ánh xạ tới phương thức "about" ActionResult bên trong profileController. Điều này cho phép chúng tôi luôn nhanh nhẹn bằng cách thực hiện một phần di chuyển một hoặc hai thư mục (hoặc nhiều tệp trong một thư mục) qua một loạt các lần chạy nước rút thay vì phải di chuyển toàn bộ trang web trong một thời gian dài hơn.

  1. Tạo ứng dụng ASP.Net MVC mới trong Visual Studio và ngay lập tức tạo quy tắc trong tệp Global.asax bỏ qua quy tắc định tuyến cho các thư mục tồn tại trong trang hiện tại.

  2. Sao chép các thư mục từ Ứng dụng web ASP.Net vào thư mục Ứng dụng ASP.Net MVC. Chạy trang web và đảm bảo trang web hoạt động đúng cách (vì không có quy tắc định tuyến nào được sử dụng).

  3. Chọn một thư mục con hoặc tập con của tệp trong thư mục phụ để di chuyển.

  4. Đối với mỗi trang .aspx bên trong thư mục con này:

    a. Tạo View của nó đầu tiên. Tôi có xu hướng sử dụng phiên bản trình duyệt web được hiển thị của trang làm HTML cơ sở của tôi và sau đó đặt trình giữ chỗ ở các vị trí mà tôi biết được lấp đầy với dữ liệu động.

    b. Sử dụng trình giữ chỗ cho dữ liệu động, tạo bản nháp đầu tiên của Mô hình bằng cách sử dụng các kiểu dữ liệu đơn giản. Mô hình này sẽ bắt đầu đơn giản, nhưng được liên tục tái cấu trúc khi bạn di chuyển nhiều trang hơn từ trang gốc, do đó, đừng lo lắng nếu nó bắt đầu tìm kiếm một chút nặng. Nếu bạn thấy mình có quá nhiều thuộc tính trong một mô hình cho khẩu vị của bạn, hoặc thấy một nhóm logic ngoài mô hình tập con nhất định, có lẽ đây là dấu hiệu cho thấy mô hình cần được cấu trúc lại để có đối tượng thay vì với những dữ liệu đơn giản này là các thuộc tính nhưng được tạo thành trong lớp logic nghiệp vụ.

    c. Tạo bộ điều khiển nếu nó chưa được tạo và đặt phương thức ActionResult thích hợp cho Hành động mà kế hoạch của bạn đã xác định sẽ định tuyến đến chế độ xem này. Nếu bạn nhận ra điều gì đó có hành động mới không ánh xạ tới trang từ trang web cũ, hãy tạo Chế độ xem cho trình điều khiển và bao gồm các thẻ // TODO: thích hợp để bạn có thể theo dõi việc này để triển khai sau bạn đã di chuyển các trang hiện có.

    d. Xem xét việc đưa vào một số mã xử lý cho các hành động không xác định là tốt, nếu bạn không có một quy tắc định tuyến {* catchall} cho điều này đã có trong tệp global.asax.cs của bạn.

    e. Tạo các lớp constructor cho Model để đưa ra các tham số nhất định mà Controller sẽ có (được thông qua dưới dạng {id} của bạn hoặc có thể là tham số Request.QueryString từ URL hoặc tiêu đề hoặc cookie HTTP), Model sẽ biết cách tiếp cận với các lớp logic kinh doanh hiện tại của bạn và tự xây dựng để hiển thị bằng Chế độ xem.

    f. Chuyển đến trang tiếp theo trong danh sách và bắt đầu lại từ bước a.

  5. Cuối cùng, tạo quy tắc định tuyến sẽ gọi cho Bộ điều khiển mới của bạn và cho phép Tác vụ bạn đã viết sẽ được triển khai. Gỡ lỗi, gỡ lỗi, gỡ lỗi ... Khi bạn hài lòng, hãy xóa thư mục và tệp hiện có mà bạn đã di chuyển khỏi trang chính của mình, cũng như quy tắc IgnoreRoute trong global.asax.cs.

  6. Tạo chuyển hướng theo bất kỳ cách nào bạn muốn nếu bạn muốn giữ tên thư mục và tệp cũ để liên tục (ví dụ: người dùng có thể đã đánh dấu trang các trang nhất định trong trang web cũ).

Lưu ý: Nếu bạn đang giữ tên chính xác của các thư mục con cũ vào trang web MVC của bạn trong giai đoạn porting, nó thích hợp hơn để di chuyển toàn bộ một thư mục con trong một thời gian tôi đã nhận ra, bởi vì chỉ làm một vài tệp các quy tắc định tuyến bạn cần viết trở nên phức tạp hơn vì nếu một thư mục hiện có tồn tại với cùng tên với đường dẫn của quy tắc định tuyến và thư mục đó có tệp Default.aspx thì (/ foldername /) sẽ mặc định là trang Default.aspx, vì phải mất tỷ lệ trước các quy tắc định tuyến.

Mẹo: Cân nhắc nghiêm túc sử dụng công cụ như RouteDebug để gỡ lỗi tuyến đường để bạn có thể tìm ra những điều kỳ lạ như trên hoặc khi bạn có nhiều quy tắc định tuyến kích hoạt và gây ra các hành vi không mong muốn.

Đây là bản nháp đầu tiên của tôi, vui lòng cho tôi phản hồi nếu tôi bỏ lỡ bất kỳ bước nào hoặc nếu bạn thấy bất kỳ lỗ nào trong hướng dẫn và tôi sẽ sửa đổi câu trả lời một cách thích hợp.

+0

Tôi thích điều này.Nó chắc chắn sẽ làm cho việc di chuyển ứng dụng của tôi trở nên dễ dàng! – ak3nat0n

+0

Làm tốt lắm thưa ngài. Tôi đang trong quá trình thực hiện chuyển đổi Classic sang .NET MVC ngay bây giờ. Tôi nghĩ điều này sẽ giúp ích rất nhiều. –

+0

+1! Làm thế nào về điều khiển tùy chỉnh? Chúng tôi có một số dự án biểu mẫu web sẽ vẫn ở dạng web và sử dụng một số điều khiển tùy chỉnh vẫn sẽ được duy trì. Có cách nào để tạo ra một wrapper cho một điều khiển trong các hình thức của một htmlhelper MVC? Chúng tôi đang tái cấu trúc một ứng dụng web cũ và muốn sử dụng MVC nhưng không thể không có khả năng kiểm soát một số cách. – jlafay

1

Có những vài lời khuyên bổ sung sẽ giúp

  • Thay <% - thẻ comment với @ *
  • sử dụng @RenderSection ("Chân", false) cho @section chân {} và cứ như vậy, nếu bạn có thêm bất kỳ ContentPlaceHolder nào ngoại trừ phần chính trong Chế độ xem RenderBody().

  • tất cả người già bình thường runat = "server" thẻ là vô hại và không ngăn chặn biên dịch và có thể được làm sạch sau đó

  • tất cả các điều khiển Tầm nhìn được dễ dàng kiểm soát trong mã phía sau và đánh dấu (Visible =" Đúng ") và được kiểm soát trong code_behind bằng cách sử dụng Id điều khiển phải được cấu trúc lại thành ViewBag Bộ sưu tập và @if khối trong chế độ xem Dao cạo.

  • bạn cũng có thể xem quá trình tuyệt vời này của Pluralsight xung quanh chủ đề này (3h 49m)

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