Làm thế nào để chuyển đổi trang web ASP.NET sang ứng dụng web ASP.NET


90

Tôi có một Trang web ASP.NET 3.5 (biệt ngữ của studio trực quan), nhưng trang này vẫn tiếp tục phát triển và trông khá cao bồi trong số những thứ khác. Tôi muốn thấy điều này được chuyển đổi thành Ứng dụng web (không gian tên và tất cả).

Đây có phải là điều có thể dễ dàng thực hiện trong Visual Studio không? Nếu không, có bất kỳ công cụ nào khác có thể tạo ra tất cả các không gian tên, v.v. một cách tự động không?


4
Mẫu trang web đó là một POS thực sự khủng khiếp so với mẫu Ứng dụng web. Tôi không thấy bất kỳ lợi ích nào của việc sử dụng mẫu trang web ...
James

9
@James - chỉ là một trong nhiều lý do khiến tôi muốn tránh xa nó ... Bạn đang thuyết giảng cho dàn hợp xướng ....
RSolberg

2
Tôi chắc chắn rằng hướng dẫn bên dưới rất kỹ lưỡng (không đọc hết), nhưng một người trên youtube đã chỉ ra một cách rất đơn giản để chuyển đổi một trang web thành một ứng dụng web tại đây: youtube.com/watch?v=oXptokM0v7w - as thông thường, tôi không thể đảm bảo rằng điều này sẽ hiệu quả với tất cả mọi người. Tôi nghĩ rằng phương pháp này sẽ hiệu quả với những người có trang web nhỏ hơn, ít phức tạp hơn.
dyslexicanaboko

3
Nếu bạn đang sử dụng VS2013, đừng quên mục menu đã được di chuyển .
Jon

Câu trả lời:


108

Chà, hóa ra tùy chọn "Chuyển đổi sang ứng dụng web" KHÔNG tồn tại cho "trang web". Tùy chọn "Chuyển đổi sang ứng dụng web" chỉ tồn tại cho "ứng dụng web" !!!!

[nhấn mạnh của tôi]

Vì vậy, đây là thỏa thuận, để thực hiện chuyển đổi, bạn cần:

  • Thêm một "Ứng dụng Web" mới vào giải pháp VS 2008 của bạn (Tệp-> Thêm-> Dự án mới-> C # -> Web-> Ứng dụng web ASP.NET).

  • Sau đó, bạn sao chép tất cả các tệp trong "trang web" cũ sang "ứng dụng web" mới tạo của bạn và ghi đè mọi tệp được tạo trong đó theo mặc định

  • Bước tiếp theo là xấu nhất, bạn cần phải "thủ công" thêm các tham chiếu trong "trang web" của mình vào "ứng dụng web" mới. Tôi nghĩ rằng đồ chơi PowerCommands VS 2008 sẽ làm điều này cho tôi vì nó sao chép các tham chiếu từ các loại dự án khác, nhưng nó đã không. Bạn phải tự mình làm điều đó theo cách thủ công và bạn phải thận trọng trong bước này nếu bạn có nhiều phiên bản của cùng một assembly (như AJAXToolkit trong trường hợp của tôi) hoặc các assembly có cả GAC và phiên bản cục bộ hoặc tương tự.

  • Tiếp tục lặp lại bước cuối cùng và cố gắng xây dựng "ứng dụng web". Bạn sẽ tiếp tục nhận được các lỗi như "'....' là không gian tên không xác định. Bạn có thiếu tham chiếu hợp ngữ không?". Đảm bảo rằng bạn không có cái nào trong số đó ngoại trừ những cái mà '....' được thay thế bằng ID của các điều khiển máy chủ mà bạn sử dụng. Nói cách khác, hãy tiếp tục thêm các tham chiếu và xây dựng dự án cho đến khi chỉ có lỗi tồn tại do thiếu tệp .DESIGNER.CS hoặc .DESIGNER.VB.

  • Sau đó, đi tới nút gốc của dự án "ứng dụng web" trong trình khám phá giải pháp VS 2008, và nhấp chuột phải vào nó, sau đó bạn SẼ tìm thấy tùy chọn "Chuyển đổi sang ứng dụng web". Những gì tùy chọn này thực hiện là thực hiện các thay đổi nhỏ đối với chỉ thị "@Page" và "@Control" của các trang và điều khiển, đồng thời tạo tệp .DESIGNER.CS hoặc .DESIGNER.VB bắt buộc.

  • Thử xây dựng lại "ứng dụng web". Nếu bạn gặp lỗi, hãy xem những tham chiếu nào có thể bị thiếu và / hoặc nhấp lại vào "Chuyển đổi sang ứng dụng web". Đôi khi, nếu có bất kỳ lỗi nào khác với lỗi do thiếu tệp DESIGNER, không phải tất cả các trang / điều khiển sẽ có tệp DESIGNER đó được tạo cho chúng. Việc khắc phục sự cố non DESIGNER và nhấp lại vào "Chuyển đổi sang ứng dụng web" sẽ thực hiện công việc này.

  • Sau khi hoàn tất xây dựng VS thành công, bạn nên sẵn sàng để bắt đầu. Bắt đầu thử nghiệm ứng dụng web của bạn. Theo tùy chọn, bạn có thể nhấp chuột phải vào nút dự án gốc "ứng dụng web" trong VS 2008 Solution Explorer và nhấp vào "Thuộc tính", sau đó chuyển đến tab "Web" để đặt "ứng dụng web" thành một thư mục ảo trong IIS (bạn có thể tạo mới thư mục ảo từ đó trong VS). Nếu bạn muốn sử dụng thư mục ảo IIS mà "trang web" cũ đã sử dụng, trước tiên bạn cần xóa thư mục đó khỏi IIS.

  • Cập nhật: Khi kiểm tra các trang của bạn, hãy CHÚ Ý NHẤT cho các lớp trong thư mục "App_Code", đặc biệt là những lớp KHÔNG CÓ NAMESPACE. Đó có thể là một cái bẫy lớn. Chúng tôi đã gặp sự cố với hai phương thức mở rộng quá tải trong cùng một lớp tĩnh không có không gian tên, một phương thức mở rộng DateTime? (Nullable) và gọi một quá tải khác tự mở rộng DateTime. Việc gọi quá tải khác là phương thức mở rộng đã vượt qua quá trình biên dịch VS 2008 và cho chúng tôi lỗi biên dịch CHỈ TRONG RUNTIME (Với IIS). Thay đổi cuộc gọi đến quá tải khác từ gọi nó là phương thức mở rộng sang gọi nó là phương thức tĩnh bình thường (chỉ thay đổi cuộc gọi trong cùng một lớp, các cuộc gọi từ các lớp khác vẫn là cuộc gọi phương thức mở rộng) đã giải quyết được vấn đề này, nhưng rõ ràng, nó không phải là an toàn như nó đã từng có trong VS 2005.

  • Cập nhật 2: Trong quá trình chuyển đổi, VS 2008 đổi tên "App_Code" của bạn thành "Old_App_Code". Cái tên mới này nghe có vẻ xấu xí, nhưng ĐỪNG TÁI TẠO NÓ LẠI. Trong mô hình "ứng dụng web", tất cả mã sẽ nằm trong một hội đồng. Trong thời gian chạy, máy chủ web không biết bạn đang sử dụng loại dự án web nào. Nó lấy tất cả mã trong thư mục "App_Code" và tạo một lắp ráp mới cho nó. Bằng cách này, nếu bạn có mã trong thư mục có tên "App_Code", bạn sẽ gặp phải lỗi biên dịch RUNTIME mà các kiểu giống nhau tồn tại trong hai tổ hợp, một được tạo bởi VS và một được tạo bởi Máy chủ phát triển IIS / ASP.NET . Để tránh điều đó. để nguyên tên "Old_App_Code" hoặc đổi tên nó thành BẤT CỨ ĐIỀU GÌ NGOẠI TRỪ: "App_Code". Không đặt bất kỳ mã nào trong "App_Code" như vậy

Tôi biết điều này từ trước đó nhưng bây giờ quên nó vì tôi đã không sử dụng mô hình "trang web" lâu :(.


2
Liên kết của bạn bị phá vỡ ở phía trên, Lỗi 500
Sameer Alibhai

6
Ngoài ra, hãy tìm kiếm các tệp mã để được sao chép dưới dạng "nội dung" chứ không phải "biên dịch"
jcolebrand

14
Đối với những người bạn đang làm việc này trên VS2013, "Chuyển đổi sang Ứng dụng web" đã được chuyển đến menu Dự án ở dưới cùng.
Eric Sassaman

3
@EricSassaman Nhưng đối với tôi thì hoàn toàn không có cho các dự án Trang web.
NickG

1
@NickG, bạn nói đúng, theo dòng đầu tiên của câu trả lời, nó KHÔNG ở đó cho các dự án trang web, menu Dự án thậm chí không tồn tại trừ khi bạn chọn Ứng dụng web trong Trình khám phá giải pháp. Nếu bạn thấy "Trang web" trên menu, đó không phải là Ứng dụng web. Làm theo các bước trên để tạo một Ứng dụng Web trống, sao chép các tệp của bạn vào đó. Sau đó, "Chuyển đổi sang Ứng dụng Web" sẽ nằm trên menu dự án cho Ứng dụng Web mới của bạn. Bạn đã làm điểu đó?
Eric Sassaman


5

Nếu bạn gặp sự cố khi tạo Dự án ứng dụng web mới của mình, hãy kiểm tra Thuộc tính tệp trong Visual Studio của tất cả các lớp 'trợ giúp'. Đối với một dự án, tôi đang chuyển đổi Hành động xây dựng được đặt thành Nội dung trong khi nó đáng lẽ phải là Biên dịch.


3

Tạo ứng dụng web mới trong VS 2010.
1. Sử dụng Windows Explorer sao chép tất cả các tệp của bạn vào thư mục dự án của bạn.
2. Trong VS 2010 giải pháp explorer hiển thị tất cả các tệp.
3. Chọn tệp và thư mục - nhấp chuột phải vào bao gồm trong dự án.
4. Nhấp chuột phải vào trình khám phá giải pháp dự án và chọn Chuyển đổi sang Ứng dụng Web.

Có một vài khác biệt nhỏ, chẳng hạn như thư mục App_Code sẽ được đổi tên thành old_app_code - điều đáng ngạc nhiên là không gây ra bất kỳ lỗi nào. TypeName trên các nguồn dữ liệu đối tượng của bạn và các kế thừa trên thẻ @Page có thể cần [ProjectName]. tiền tố được nối trên toàn cầu. Ví dụ: nếu tên loại của bạn là "BusinessLogic.OrderManager" và tên dự án của bạn là InventorySystem, bạn sẽ cần thay đổi nó thành InventorySystem.BusinessLogic.OrderManager. Ngoài ra, một số thay đổi về hiển thị, chẳng hạn như trình xác thực trường bắt buộc không mặc định là phông chữ đỏ nữa, chúng mặc định thành màu đen.


tệp mã ứng dụng của tôi đã không thay đổi như giả sử. Tôi đã phải đổi tên nó theo cách thủ công sau đó thay đổi tất cả các trang cs để biên dịch.
Mike

3

Tôi đã phải đối mặt với những vấn đề tương tự ban đầu. Sau khi theo dõi cuốn sách Wrox Professional ASP.NET 4.0, tôi đã tìm thấy giải pháp sau cho trường hợp của mình.

Lần đầu tiên tôi tạo một ứng dụng web mới. Đã sao chép tất cả các tệp trang web vào thư mục ứng dụng web. Nhấp chuột phải vào ứng dụng và nhấp vào chuyển đổi sang ứng dụng web.

Bạn có thể hỏi tại sao bạn cần chuyển đổi một ứng dụng web thành một ứng dụng web. Câu trả lời là khi bạn tạo một trang web, bạn chỉ cần viết mã tệp .cs khi cần thiết. Tuy nhiên, ứng dụng web khai báo .design.cs (hoặc .vb) và tệp .cs cho phần mã và thiết kế một cách tự động.

TIẾP THEO: Xóa tất cả các tham chiếu thủ công, chẳng hạn như thuộc tính 'Kế thừa' trong chỉ thị PAGE, đối với các tệp khác trong trang web của bạn, vì không gian tên SẼ đảm nhiệm việc tham chiếu tập trung các lớp.

Tôi cũng gặp phải một vấn đề, vì tôi chưa đưa thư mục OBJ và BIN vào dự án của mình. Nếu bạn cho rằng mình đang thiếu các thư mục BIN và OBJ, chỉ cần nhấp vào biểu tượng 'Hiển thị Tất cả Tệp' trong Trình khám phá Giải pháp, sau đó nhấp chuột phải vào các thư mục bị thiếu và thêm vào dự án. (để đảm bảo chúng biên dịch với dự án.)

CẬP NHẬT: Như @deadlychambers đã chỉ ra trong nhận xét: Bạn có thể tìm kiếm ở mọi nơi bằng cách thực hiện "Ctrl + Shift + F" và sau đó tìm kiếm Inherits="(.*?)". Điều này sẽ tìm thấy tất cả các lần xuất hiện và có thể giúp bạn tiết kiệm thời gian!


1
Bạn có thể xóa tất cả bằng Ctrl-shift-F và sau đó thay đổi các tùy chọn tìm kiếm cho cụm từ thông dụng và sử dụng Điều này thừa kế = "(. *)?"
DeadlyChambers

1
Kiểm tra xem có phải là Inherits = "(. *?)" Hay không, cái còn lại sẽ lấy mọi thứ đằng sau kế thừa cho đến dấu ngoặc kép cuối cùng.
DeadlyChambers

1
Tôi vừa gặp phải một vấn đề mà KHÔNG có kế thừa khiến nhà thiết kế xóa không gian tên sau đó xóa lớp. Tôi ước điều này dễ dàng hơn.
DeadlyChambers

3

Bây giờ tôi đã chuyển thành công một dự án Trang web sang một ứng dụng web và có một số điều cần lưu ý.

Có ReSharper theo ý của bạn sẽ giúp rất nhiều trong việc cấu trúc lại các tệp aspx.

  1. Thiết lập giải pháp của bạn và tạo một Ứng dụng web trống
  2. Sao chép tất cả các tệp
  3. tệp aspx trong các dự án trang web không có namspace. Bao bọc các lớp của bạn trong không gian tên thích hợp
  4. Trong quá trình sao chép, tất cả các trang của tôi trong các thư mục con đã được đổi tên thành tên dự án và tên thư mục của tôi, vì vậy tôi đã nhận được 40ish public partial class FolderName_Projectname : PageNếu cần thiết phải đổi tên tất cả các tệp bằng cách sử dụng Resharper hoặc thủ công. Nếu bạn gặp nhiều lỗi như vậy "There is already a member Page_Load() defined", rất có thể đây là do tên lớp không chính xác và bị trùng lặp
  5. Sau khi thêm một không gian tên
  6. Thay thế CodeFiletrong tất cả các trang aspx bằng Codebehindvà đặc biệt chú ý đến các tệp i thư mục con của bạn. Đảm bảo Inhertis=""không chứa đường dẫn tương đối. Không gian tên của bạn chăm sóc mọi thứ. Vì vậy, định dạng chính xác là Inherits="Namespace.classname". Nếu lớp của bạn có không gian tên NaSpa và tên tệp foo.cs thì nó sẽ làInherits="NaSpa.foo"

  7. Sau khi bạn đã chuẩn bị tất cả các tệp của mình (đừng quên các trang chính của bạn), hãy chạy "Chuyển đổi sang ứng dụng web". Nếu bạn gặp lỗi sau đó, hãy rửa sạch và lặp lại. Nếu bạn gặp lỗi kiểu "Không tìm thấy TextBoxName có phải bạn đang thiếu tham chiếu", hãy đảm bảo rằng bạn không quên làm sạch các trang aspx của mình. Một chỉ báo tốt là kiểm tra các tệp thiết kế được tạo tự động. Nếu TextBoxNamekhông xuất hiện trong đó, chuyển đổi đã không thành công hoàn toàn.

  8. Giải quyết bất kỳ phụ thuộc nào bị thiếu.
  9. Xây dựng

0

không gian tên ASP mặc định dường như không hoạt động nữa. Vì vậy, tôi dường như không thể gọi các trang User Controls.ascx của mình từ bên ngoài trang. Cung cấp cho họ một không gian tên và thay đổi mặc định từ ASP thành không gian tên của tôi dường như hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.