Warum wird beim Aktualisieren von cshtml-Dateien mit .NET-Code keine Kompilierung benötigt?

8

Ich benutze Asp.net Mvc und ich wollte wissen, warum ich mein Projekt nicht kompilieren muss, wenn ich .net Code in cshtml Dateien aktualisiere? Wenn wir nun über html \ css-Updates sprechen, dann verstehe ich ganz klar, warum eine einfache Aktualisierung ausreichen würde, aber wie kompiliert .net-Code in diesen Fällen?

Sagen wir, ich habe eine Ansicht und möchte etwas c # -Code hinzufügen, etwa Datetime.Now.ToString();
Jetzt könnte ich normalerweise diese Codezeile zu meiner cshtml-Datei hinzufügen, die Datei speichern, die Seite aktualisieren und das Ergebnis ohne Kompilierung sehen.

Wenn ich das gleiche "nach Buch" machen würde, indem ich meinem Modell eine Eigenschaft hinzufüge, die Datetime.Now.ToString() in meinem Controller zuweiße und einfach die neue Variable rendiere, müsste ich meinen Code kompilieren, um die Änderungen zu sehen.

Wie funktioniert diese Magie? Wenn es so einfach ist, warum kann das nicht auch mit CS-Dateien gemacht werden?

P. s. Die gleiche Frage ist relevant für asp.net-Anwendungen und aspx \ ascx-Seiten.

    
Amir Popovich 26.07.2014, 07:31
quelle

2 Antworten

9

.cshtml -Dateien werden Just-in-Time kompiliert, wenn eine Anfrage bezüglich dieser Seiten eintrifft.

Allerdings sind die Controller vorkompiliert und in den DLL-Dateien Ihres Projekts gespeichert.

Die Entscheidung, welche Sie verwenden, hängt von Ihren Bedürfnissen ab. Beim Vorkompilieren erhalten Sie weniger Reaktionszeit (weil Sie den Code zuvor kompiliert haben), aber die Just-in-Time-Kompilierung bietet Ihnen Flexibilität.

    
Alireza 26.07.2014, 07:38
quelle
7

Ein Teil der ASP.NET-Infrastruktur ist der ASP.NET-Compiler. Es ist verantwortlich für das Kompilieren deklarativer Ressourcen (* .aspx, * .ascx, * .cshtml usw.) in ausführbaren Code.

Es gibt keine Magie, die Laufzeit entscheidet, wann der Compiler ausgeführt wird (zB wenn die Ressource seit dem letzten Lauf geändert wurde) und ruft dann den Compiler auf, um einen imperativen Code aus dem deklarativen Code zu erzeugen (zB ein * .aspx ist) kompiliert in * .cs). Dann ruft es regulären Sprachencompiler auf, um eine * .dll zu erhalten, die CIL enthält.

Dies erfordert etwas Zeit für den ersten Zugriff auf eine Ressource. Es könnte nützlich sein, alle deklarativen Ressourcen im Voraus zu kompilieren.

Übersicht:

Ссылка

Vorkompilierung:

Ссылка

    
Wiktor Zychla 26.07.2014 07:42
quelle