Jak przekonwertować witrynę ASP.NET na aplikację internetową ASP.NET

90

Mam witrynę ASP.NET 3.5 (język Visual Studio), ale witryna wciąż się rozwija i między innymi wygląda raczej kowbojsko. Chciałbym, aby to zostało przekonwertowane na aplikację internetową (przestrzenie nazw i wszystkie).

Czy jest to coś, co można łatwo zrobić w programie Visual Studio? Jeśli nie, czy istnieją inne narzędzia, które mogłyby automagicznie tworzyć wszystkie przestrzenie nazw itp.?

RSolberg
źródło
4
Ten szablon strony internetowej jest naprawdę okropnym punktem sprzedaży w porównaniu do szablonu aplikacji internetowej. Nie widzę żadnej korzyści z używania szablonu strony internetowej ...
James,
9
@James - tylko jeden z wielu powodów, szukam odchodzić od niej ... jesteś głoszenie do chóru ....
RSolberg
2
Jestem pewien, że poniższy opis jest bardzo dokładny (nie przeczytał go w całości), ale osoba na youtube pokazała tutaj bardzo prosty sposób konwersji strony internetowej na aplikację internetową: youtube.com/watch?v=oXptokM0v7w - as Zwykle nie mogę zagwarantować, że to zadziała dla wszystkich. Myślę, że ta metoda zadziała dla osób z mniejszymi, mniej skomplikowanymi witrynami.
dyslexicanaboko
3
Jeśli używasz VS2013, nie zapomnij, że element menu został przeniesiony .
Jon

Odpowiedzi:

108

Otóż ​​okazuje się, że opcja "Konwertuj na aplikację webową" NIE istnieje dla "stron internetowych". Opcja „Konwertuj na aplikację internetową” istnieje tylko dla „aplikacji internetowych” !!!!

[podkreślenie moje]

Oto umowa, aby dokonać konwersji, musisz:

  • Dodaj nową „aplikację sieci Web” do rozwiązania VS 2008 (Plik-> Dodaj-> Nowy projekt-> C # -> Sieć-> Aplikacja internetowa ASP.NET).

  • Następnie kopiujesz wszystkie pliki ze starej „witryny” do nowo utworzonej „aplikacji internetowej” i domyślnie zastępujesz wszystkie utworzone w niej pliki

  • Następny krok jest najbrzydszy, musisz „ręcznie” dodać odniesienia ze swojej „witryny” do nowej „aplikacji internetowej”. Myślałem, że zabawka VS 2008 PowerCommands zrobi to za mnie, ponieważ kopiuje odniesienia z innych typów projektów, ale tak się nie stało. Musisz to zrobić samodzielnie, ręcznie i musisz być ostrożny w tym kroku, jeśli masz wiele wersji tego samego zestawu (jak AJAXToolkit w moim przypadku) lub zestawy, które mają zarówno wersje GAC, jak i lokalne.

  • Powtarzaj ostatni krok i próbuj zbudować „aplikację internetową”. Będziesz otrzymywać błędy, takie jak „'....' to nieznana przestrzeń nazw. Brakuje odwołania do zestawu?”. Upewnij się, że nie masz żadnego z nich poza tymi, w których „....” jest zastępowane identyfikatorami kontrolek serwera, których używasz. Innymi słowy, dodawaj odniesienia i buduj projekt, aż do błędów, które istnieją z powodu brakujących plików .DESIGNER.CS lub .DESIGNER.VB.

  • Następnie przejdź do węzła głównego projektu „aplikacja internetowa” w eksploratorze rozwiązań VS 2008 i kliknij go prawym przyciskiem myszy, a ZNAJDZIESZ opcję „Konwertuj na aplikację internetową”. To, co robi ta opcja, to w rzeczywistości wprowadzanie niewielkich zmian w dyrektywach „@Page” i „@Control” stron i kontrolek oraz tworzenie wymaganych plików .DESIGNER.CS lub .DESIGNER.VB.

  • Spróbuj ponownie zbudować „aplikację internetową”. Jeśli pojawią się błędy, sprawdź, jakich odniesień może brakować i / lub kliknij ponownie „Konwertuj na aplikację internetową”. Czasami, jeśli wystąpi jakikolwiek błąd inny niż te spowodowane brakującymi plikami DESIGNER, nie wszystkie strony / kontrolki będą miały utworzone dla nich pliki DESIGNER. Rozwiązanie problemu innego niż PROJEKTANT i ponowne kliknięcie „Konwertuj na aplikację internetową” powinno załatwić sprawę.

  • Gdy zakończysz pomyślnie kompilację VS, powinieneś być gotowy do pracy. Zacznij testować swoją aplikację internetową. Opcjonalnie możesz kliknąć prawym przyciskiem myszy węzeł projektu głównego „aplikacji sieci Web” w programie VS 2008 Solution Explorer i kliknąć „Właściwości”, a następnie przejść do karty „Sieć”, aby ustawić „aplikację sieci Web” na folder wirtualny w usługach IIS (można utworzyć nowy katalog wirtualny stamtąd w VS). Jeśli chcesz używać katalogu wirtualnego usług IIS, z którego korzystała stara „witryna sieci Web”, musisz najpierw usunąć go z usług IIS.

  • Aktualizacja: Podczas testowania swoich stron, NAJWYŻSZĄ UWAGĘ należy zwracać na zajęcia w folderze „App_Code”, zwłaszcza te, które NIE MA NAZWISKA. To może być duża pułapka. Mieliśmy problem z dwoma przeciążeniami metod rozszerzających w tej samej klasie statycznej, która nie miała przestrzeni nazw, jeden rozszerza DateTime? (Nullable) i wywołuje inne przeciążenie, które rozszerza samo DateTime. Wywołanie drugiego przeciążenia jako metody rozszerzającej przeszło kompilację VS 2008 i dało nam błąd kompilacji TYLKO W CZASIE PRACY (z usługami IIS). Zmiana wywołania na inne przeciążenie z wywołania go jako metody rozszerzającej na wywołanie go jako zwykłej metody statycznej (tylko zmiana wywołania w tej samej klasie, wywołania z innych klas pozostały wywołaniami metody rozszerzającej) rozwiązało ten problem, ale wyraźnie nie jest tak bezpieczny jak w VS 2005.

  • Aktualizacja2: Podczas konwersji VS 2008 zmienia nazwę „App_Code” na „Old_App_Code”. Ta nowa nazwa brzmi brzydko, ale NIE ZMIENIAJ JE Z powrotem. W modelu „aplikacji sieci web” cały kod będzie w jednym zestawie. W czasie wykonywania serwer WWW nie wie, jakiego typu projektu WWW używasz. Pobiera cały kod z folderu „App_Code” i tworzy dla niego nowy zestaw. W ten sposób, jeśli masz kod w folderze o nazwie „App_Code”, otrzymasz błędy kompilacji RUNTIME, że te same typy istnieją w dwóch zestawach, utworzonym przez VS i utworzonym przez IIS / ASP.NET Development Server . Aby tego uniknąć. pozostaw „Old_App_Code” z tą samą nazwą lub zmień jego nazwę na WSZYSTKO Z WYJĄTKIEM: „App_Code”. Nie umieszczaj żadnego kodu w takim „App_Code”

Wiem to już wcześniej, ale teraz zapomniałem, ponieważ od dawna nie korzystałem z modelu "strony" :(.

Andrew Hare
źródło
2
Twój link jest uszkodzony u góry, Błąd 500
Sameer Alibhai,
6
Szukaj również plików kodu, które mają zostać skopiowane jako „zawartość”, a nie „kompilacja”
jcolebrand
14
Dla tych z Was, którzy robią to w VS2013, „Ukryj w aplikacji internetowej” zostało przeniesione do menu Projekt u dołu.
Eric Sassaman
3
@EricSassaman Ale dla mnie nie ma go wcale, jeśli chodzi o projekty stron internetowych.
NickG,
1
@NickG, masz rację, jak w pierwszym wierszu odpowiedzi, NIE ma go w przypadku projektów witryn internetowych, menu Projekt nawet nie istnieje, chyba że wybierzesz aplikację internetową w Eksploratorze rozwiązań. Jeśli widzisz w menu „Witryna”, nie jest to aplikacja internetowa. Wykonaj powyższe kroki, aby utworzyć pustą aplikację internetową i skopiuj do niej swoje pliki. Następnie w menu projektu nowej aplikacji internetowej powinna znajdować się opcja „Konwertuj na aplikację internetową”. Czy ty to zrobiłeś?
Eric Sassaman
5

Jeśli masz problemy z uzyskaniem nowego projektu aplikacji sieci Web do kompilacji, sprawdź właściwości pliku w programie Visual Studio wszystkich klas pomocniczych. W przypadku projektu, który konwertowałem, Akcja kompilacji była ustawiona na Zawartość, podczas gdy powinna być Kompiluj.

Matt Burrell
źródło
3

Utwórz nową aplikację internetową w VS 2010.
1. Za pomocą Eksploratora Windows skopiuj wszystkie pliki do folderu projektu.
2. W eksploratorze rozwiązań VS 2010 pokaż wszystkie pliki.
3. Wybierz pliki i foldery - kliknij prawym przyciskiem myszy włącz do projektu.
4. Kliknij prawym przyciskiem myszy eksplorator rozwiązań projektu i wybierz Konwertuj na aplikację internetową.

Istnieje kilka drobnych różnic, na przykład nazwa folderu App_Code zostanie zmieniona na old_app_code - to zaskakująco nie powoduje żadnych błędów. TypeName w źródłach danych obiektu i elementy dziedziczone w tagu @Page mogą wymagać [ProjectName]. przedrostek dołączony globalnie. Na przykład, jeśli nazwa typu to „BusinessLogic.OrderManager”, a nazwa projektu to InventorySystem, należy zmienić ją na InventorySystem.BusinessLogic.OrderManager. Również kilka zmian w wyświetlaniu, takich jak wymagane walidatory pól nie są już domyślnie czerwoną czcionką, domyślnie są czarne.

Tim Samandari
źródło
mój plik kodu aplikacji nie zmienił się tak, jak powinien. Musiałem ręcznie zmienić jego nazwę, a następnie zmienić wszystkie strony cs do kompilacji.
Mike
3

Początkowo miałem te same problemy. Po przejrzeniu książki Wrox Professional ASP.NET 4.0 znalazłem następujące rozwiązanie dla mojego przypadku.

Najpierw stworzyłem nową aplikację internetową. Skopiowano wszystkie pliki witryny do folderu aplikacji internetowej. Kliknij aplikację prawym przyciskiem myszy i kliknij konwertuj do aplikacji internetowej.

Możesz zapytać, dlaczego musisz przekonwertować aplikację internetową na aplikację internetową. Odpowiedź brzmi: kiedy tworzysz stronę internetową, po prostu kodujesz plik .cs tam, gdzie jest to wymagane. Jednak aplikacja internetowa automatycznie deklaruje .design.cs (lub .vb) i plik .cs dla sekcji kodu i projektu.

DALEJ: Usuń wszystkie ręczne odwołania, takie jak atrybut „Inherits” w dyrektywie PAGE, do innych plików w witrynie, ponieważ przestrzenie nazw BĘDĄ zadbać o centralne odwoływanie się do klas.

Miałem też problem, ponieważ w swoim projekcie nie umieściłem folderów OBJ i BIN. Jeśli uważasz, że brakuje Ci folderów BIN i OBJ, po prostu kliknij ikonę „Pokaż wszystkie pliki” w Eksploratorze rozwiązań, a następnie kliknij prawym przyciskiem myszy brakujące foldery i dodaj do projektu. (aby upewnić się, że zostaną skompilowane z projektem).

AKTUALIZACJA: Jak @deadlychambers wskazuje w komentarzach: Możesz wyszukiwać wszędzie, wykonując „Ctrl + Shift + F”, a następnie wyszukując Inherits="(.*?)". Pozwoli to znaleźć wszystkie wystąpienia i prawdopodobnie zaoszczędzi trochę czasu!

Sunny R Gupta
źródło
1
Możesz usunąć wszystko za pomocą Ctrl-Shift-F, a następnie zmienić opcje wyszukiwania dla wyrażenia regularnego i użyć tego Inherits = "(. *)?"
DeadlyChambers
1
Sprawdź, czy jest to Inherits = "(. *?)", A druga pobierze wszystko za dziedziczeniem, aż do ostatniego cudzysłowu.
DeadlyChambers
1
Właśnie napotkałem problem polegający na tym, że BRAK dziedziczenia spowodował, że projektant usunął przestrzeń nazw, a następnie usunął klasę. Chciałbym, żeby to było łatwiejsze.
DeadlyChambers
3

Udało mi się teraz przeprowadzić migrację jednego projektu witryny sieci Web do aplikacji internetowej i jest kilka problemów, na które należy zwrócić uwagę.

Posiadanie ReSharper do Twojej dyspozycji bardzo pomaga w refaktoryzacji plików aspx.

  1. Skonfiguruj swoje rozwiązanie i utwórz pustą aplikację WebApplication
  2. Skopiuj cały plik
  3. aspx w projektach witryny sieci Web nie mają obszaru nazw. Umieść swoje klasy w odpowiednich przestrzeniach nazw
  4. Podczas kopiowania wszystkie moje strony w podfolderach zostały przemianowane na nazwę mojego projektu i nazwę folderu, więc otrzymałem 40ish public partial class FolderName_Projectname : PageJeśli to konieczne, zmień nazwy wszystkich plików za pomocą Resharper lub ręcznie. Jeśli napotkasz wiele błędów, takich jak "There is already a member Page_Load() defined", najprawdopodobniej jest to spowodowane nieprawidłowymi nazwami klas i powieleniem
  5. Po dodaniu przestrzeni nazw
  6. Zastąp CodeFilena wszystkich stronach aspx, Codebehinda szczególnie zwróć uwagę na pliki w Twoim podfolderze. Upewnij się, Inhertis=""że nie zawiera ścieżki względnej. Twoje przestrzenie nazw zajmują się wszystkim. Więc poprawny format to Inherits="Namespace.classname". Jeśli twoja klasa ma przestrzeń nazw NaSpa i nazwę pliku foo.cs, tak będzieInherits="NaSpa.foo"

  7. Po przygotowaniu wszystkich plików (nie zapomnij o stronach wzorcowych) uruchom „Konwertuj na aplikację internetową”. Jeśli później napotkasz błędy, spłucz i powtórz. Jeśli napotkasz błędy typu „Nie można znaleźć TextBoxName czy brakuje odwołania”, upewnij się, że nie zapomniałeś wyczyścić stron aspx. Dobrym wskaźnikiem jest sprawdzenie automatycznie wygenerowanych plików projektanta. Jeśli TextBoxNamesię tam nie pojawi, konwersja nie powiodła się całkowicie.

  8. Rozwiąż wszelkie brakujące zależności.
  9. Budować
Marco
źródło
0

Wydaje się, że domyślna przestrzeń nazw ASP już nie działa. Dlatego nie mogę wywołać moich stron User Controls.ascx spoza strony. Zapewnienie im przestrzeni nazw i zmiana domyślnej z ASP na moją przestrzeń nazw wydawało się działać.

Mikrofon
źródło