CodeFile vs CodeBehind

138

Jaka jest różnica pomiędzy CodeFile = "file.ascx.cs" a CodeBehind = "file.ascx.cs" w deklaracji kontrolki użytkownika ASP.NET?

Czy jest nowszy lub zalecany? Czy mają określone przeznaczenie?

Soldarnal
źródło

Odpowiedzi:

163

CodeBehind : wymaga kompilacji (model ASP.NET 1.1). Skompilowany plik binarny jest umieszczany w folderze bin witryny. Przed wdrożeniem musisz przeprowadzić kompilację w programie Visual Studio. To dobry model, gdy nie chcesz, aby kod źródłowy był widoczny jako zwykły tekst. Na przykład przy dostawie do klienta, któremu nie masz obowiązku podania kodu.

CodeFile : dostarczasz plik źródłowy z rozwiązaniem do wdrożenia. Środowisko uruchomieniowe ASP.NET 2.0 kompiluje kod w razie potrzeby. Skompilowane pliki znajdują się w Microsoft.NET [wersja .NET] \ Temporary ASP.NET Files.

Shafqat Ahmed
źródło
2
Czy to oznacza, że ​​programista musi ręcznie zmienić atrybut dyrektywy Page, czy też istnieje sposób na utworzenie projektu internetowego, który domyślnie wybiera kod za lub plik kodu za każdym razem, gdy dodawana jest nowa strona internetowa?
Matt W
38
Widzę to w taki sposób, że CodeFile jest przeznaczone do użytku w „witrynie internetowej”, a „Codebehind” jest przeznaczone do „projektu aplikacji sieci Web”, ponieważ musi zostać skompilowany. Dlatego podczas konwertowania „Witryny internetowej” na „Projekt aplikacji sieci Web” może być konieczna ręczna zmiana wszystkich wystąpień CodeFile na Codebehind!
renegadeMind
2
Pliki CodeFile są przydatne podczas programowania, ponieważ możesz testować zmiany po prostu zapisując i odświeżając stronę i bez konieczności budowania projektu. Nadal możesz opcjonalnie „opublikować” pliki modelu kompilacji .Net 2+ CodeFile jako pliki DLL, jeśli nie lubisz publikować plików .cs i .vb na serwerze produkcyjnym. Podczas publikowania projektu można opcjonalnie wybrać opcje „Precompile”, aby przekształcić jeden lub oba pliki .aspx i .cs / .vb w biblioteki DLL, podobnie jak w CodeBehind.
scradam
1
Jak zauważył renegadeMind (i z pozytywnych głosów, jakie otrzymuje), myślę, że odpowiedź powinna zostać zredagowana, aby podkreślić fakt, że CodeFile jest głęboko powiązane z rozwiązaniem typu „witryna internetowa”, podczas gdy CodeBehind jest powiązane z „projektem aplikacji internetowej” . Niestety moja zmiana została odrzucona.
frenchone
3
fakt, że codebehind jest powiązany z asp 1.1, podczas gdy codefile jest powiązany z asp.net 2.0, może łączyć się z myślą, że codefile są „lepsze” od codebehind, gdy tak nie jest (a IMHO jest dokładnie odwrotnie: aplikacje internetowe są lepsze niż witryny internetowe)
frenchone
5

Plik Codebehind musi się skompilować przed uruchomieniem, ale w src nie musimy kompilować, a następnie uruchamiać ... po prostu zapisz plik.


źródło
1
but in src- masz na myśli but in the CodeFile?
Don Cheadle,
5

Pracuję z projektem aplikacji w Visual Studio Express 2012 dla sieci Web i używam .NET 4.0. W kodzie plików dla moich stron logowania i zmiany hasła znalazłem sytuację, w której potrzebowałem zarówno CodeBehind, jak i CodeFile w deklaracji.

Jeśli nie dodam odwołania do pliku kodu, takiego jak

CodeFile=login.aspx.cs

Strona internetowa nie analizuje, a przeglądarka wyświetla błąd parsera. Nie ma znaczenia, czy skompiluję projekt, czy nie.

Jeśli nie dodam kodu za odwołaniem, takim jak

CodeBehind=login.aspx.cs

Odwołania do klas zabezpieczeń, takich jak MembershipUser, kończą się niepowodzeniem zarówno w czasie kompilacji, jak i podczas próby użycia funkcji Intellisense z błędem typu „Nie można znaleźć typu lub przestrzeni nazw MembershipUser”. Dodałem odwołanie do System.Web.ApplicationServices zgodnie z wymaganiami frameworka .Net 4.0.

Dodam, że te kłopotliwe pliki działają w aplikacji w ramach serwisu WWW stworzonej za pomocą narzędzia IIS Application. Kiedy otwieram witrynę z programu Visual Studio, nie mam żadnych problemów z błędami parsera lub błędami odwołań. To zamieszanie występuje tylko wtedy, gdy otwieram aplikację jako projekt w programie Visual Studio.

DavidHyogo
źródło
1
Wiem, co masz na myśli, John. I może to zasługuje na negatywną opinię, ale w tej chwili naprawdę zmagam się z tym problemem. Może moje trudności nie wynikają z tej różnicy, ale z czegoś innego. Jednak chociaż przyjęta odpowiedź odpowiada na pytanie, nie pomaga to w praktycznym problemie, z którym się spotykam. Może powinienem otworzyć nowe pytanie.
DavidHyogo