Compilation de fichiers Razor dans ASP.NET Core

Les fichiers Razor avec l’extension .cshtml sont compilés au moment de la génération et de la publication à l’aide du kit SDK Razor. La compilation à l’exécution peut éventuellement être activée en configurant le projet.

Notes

Compilation à l'exécution :

Compilation Razor

La compilation au moment de la génération et de la publication des fichiers Razor est activée par défaut par le kit SDK Razor. Lorsqu’elle est activée, la compilation à l’exécution complète la compilation au moment de la génération, ce qui permet aux fichiers Razor d’être mis à jour s’ils sont modifiés pendant l’exécution de l’application.

La mise à jour des vues Razor et de Razor Pages lors du développement pendant l’exécution de l’application est également prise en charge à l’aide du rechargement à chaud .NET.

Notes

Lorsqu’elle est activée, la compilation à l’exécution désactive le rechargement à chaud .NET. Nous vous recommandons d’utiliser le rechargement à chaud plutôt que la compilation Razor à l’exécution pendant le développement.

Activer la compilation à l’exécution pour tous les environnements

Pour activer la compilation à l’exécution pour tous les environnements :

  1. Installez le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. Appelez AddRazorRuntimeCompilation dans Program.cs :

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages()
        .AddRazorRuntimeCompilation();
    

Activer la compilation à l'exécution de manière conditionnelle

La compilation à l'exécution peut être activée de manière conditionnelle, ce qui garantit que la sortie publiée :

  • Utilise des vues compilées.
  • N’active pas les observateurs de fichiers en production.

Pour activer la compilation à l'exécution uniquement pour l’environnement de développement :

  1. Installez le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. Appelez AddRazorRuntimeCompilation dans Program.cs lorsque l’environnement actuel est défini sur Développement :

    var builder = WebApplication.CreateBuilder(args);
    
    var mvcBuilder = builder.Services.AddRazorPages();
    
    if (builder.Environment.IsDevelopment())
    {
        mvcBuilder.AddRazorRuntimeCompilation();
    }
    

La compilation à l'exécution peut également être activée avec un assembly de démarrage d’hébergement. Pour activer la compilation à l'exécution dans l’environnement de développement pour des profils de lancement spécifiques :

  1. Installez le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Modifiez la section environmentVariables du profil de lancement dans launchSettings.json :
    • Vérifiez que ASPNETCORE_ENVIRONMENT est défini sur "Development".

    • Définissez ASPNETCORE_HOSTINGSTARTUPASSEMBLIES sur "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation". Par exemple, le fichier launchSettings.json suivant active la compilation à l'exécution pour les profils de lancement ViewCompilationSample et IIS Express :

      {
        "iisSettings": {
          "windowsAuthentication": false,
          "anonymousAuthentication": true,
          "iisExpress": {
            "applicationUrl": "http://localhost:7098",
            "sslPort": 44332
          }
        },
        "profiles": {
          "ViewCompilationSample": {
            "commandName": "Project",
            "dotnetRunMessages": true,
            "launchBrowser": true,
            "applicationUrl": "https://localhost:7173;http://localhost:5251",
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development",
              "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
            }
          },
          "IIS Express": {
            "commandName": "IISExpress",
            "launchBrowser": true,
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development",
              "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
            }
          }
        }
      }
      

Avec cette approche, aucune modification du code n’est nécessaire dans Program.cs. Au moment de l’exécution, ASP.NET Core recherche un attribut HostingStartup au niveau de l’assembly dans Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. L’attribut HostingStartup spécifie le code de démarrage de l’application à exécuter et ce code de démarrage permet la compilation à l'exécution.

Activer la compilation à l'exécution pour une bibliothèque de classes Razor

Imaginez un scénario dans lequel un projet Razor Pages fait référence à une bibliothèque de classes (RCL) Razor nommée MyClassLib. Le RCL contient un fichier _Layout.cshtml consommé par les projets MVC et Razor Pages. Pour activer la compilation à l'exécution pour le fichier _Layout.cshtml dans ce RCL, apportez les modifications suivantes dans le projet Razor Pages :

  1. Activez la compilation à l'exécution avec les instructions de Activer la compilation à l'exécution de manière conditionnelle.

  2. Configurez MvcRazorRuntimeCompilationOptions dans Program.cs :

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages();
    
    builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
    {
        var libraryPath = Path.GetFullPath(
            Path.Combine(builder.Environment.ContentRootPath, "..", "MyClassLib"));
    
        options.FileProviders.Add(new PhysicalFileProvider(libraryPath));
    });
    

    Le code précédent génère un chemin d’accès absolu au RCL MyClassLib. L’API PhysicalFileProvider est utilisée pour localiser les répertoires et les fichiers à ce chemin d’accès absolu. Enfin, l’instance PhysicalFileProvider est ajoutée à une collection de fournisseurs de fichiers, ce qui permet d’accéder aux fichiers .cshtml du RCL.

Ressources supplémentaires

Les fichiers Razor avec l’extension .cshtml sont compilés au moment de la génération et de la publication à l’aide du kit SDK Razor. La compilation à l’exécution peut éventuellement être activée en configurant votre projet.

Compilation Razor

La compilation au moment de la génération et de la publication des fichiers Razor est activée par défaut par le kit SDK Razor. Quand elle est activée, la compilation à l’exécution complète la compilation au moment de la génération, ce qui permet aux fichiers Razor d’être mis à jour s’ils sont modifiés.

Activer la compilation à l'exécution lors de la création du projet

Les modèles de projet Razor Pages et MVC incluent une option permettant d’activer la compilation à l'exécution lors de la création du projet. Cette option est prise en charge dans ASP.NET Core 3.1 et versions ultérieures.

Dans la boîte de dialogue Créer une application web ASP.NET Core :

  1. Sélectionnez le modèle de projet Application web ou Application web (Model-View-Controller).
  2. Cochez la case Activer la compilation à l'exécution Razor.

Activer la compilation à l'exécution dans un projet existant

Pour activer la compilation à l'exécution pour tous les environnements d’un projet existant :

  1. Installez le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. Mettre à jour la méthode Startup.ConfigureServices du projet pour inclure un appel à AddRazorRuntimeCompilation. Par exemple :

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages()
            .AddRazorRuntimeCompilation();
    
        // code omitted for brevity
    }
    

Activer de manière conditionnelle la compilation à l'exécution dans un projet existant

La compilation à l'exécution peut être activée de telle sorte qu’elle soit uniquement disponible pour le développement local. L’activation conditionnelle de cette manière garantit que la sortie publiée :

  • Utilise des vues compilées.
  • N’active pas les observateurs de fichiers en production.

Pour activer la compilation à l'exécution uniquement dans l’environnement de développement :

  1. Installez le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Modifiez la section environmentVariables du profil de lancement dans launchSettings.json :
    • Vérifiez que ASPNETCORE_ENVIRONMENT est défini sur "Development".
    • Définissez ASPNETCORE_HOSTINGSTARTUPASSEMBLIES sur "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation".

Dans l’exemple suivant, la compilation à l'exécution est activée dans l’environnement de développement pour les profils de lancement IIS Express et RazorPagesApp :

{
    "iisSettings": {
      "windowsAuthentication": false,
      "anonymousAuthentication": true,
      "iisExpress": {
        "applicationUrl": "http://localhost:57676",
        "sslPort": 44364
      }
    },
    "profiles": {
      "IIS Express": {
        "commandName": "IISExpress",
        "launchBrowser": true,
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development",
          "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
        }
      },
      "RazorPagesApp": {
        "commandName": "Project",
        "launchBrowser": true,
        "applicationUrl": "https://localhost:5001;http://localhost:5000",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development",
          "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
        }
      }
    }
  }

Aucune modification du code n’est nécessaire dans la classe Startup du projet. Au moment de l’exécution, ASP.NET Core recherche un attribut HostingStartup au niveau de l’assembly dans Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. L’attribut HostingStartup spécifie le code de démarrage de l’application à exécuter. Ce code de démarrage active la compilation à l'exécution.

Activer la compilation à l'exécution pour une bibliothèque de classes Razor

Imaginez un scénario dans lequel un projet Razor Pages fait référence à une bibliothèque de classes (RCL) Razor nommée MyClassLib. Le RCL contient un fichier _Layout.cshtml que tous les projets MVC et Razor Pages de votre équipe consomment. Vous souhaitez activer la compilation à l'exécution pour le fichier _Layout.cshtml dans ce RCL. Apportez les modifications suivantes dans le projet Razor Pages :

  1. Activez la compilation à l'exécution avec les instructions Activer de manière conditionnelle la compilation à l'exécution dans un projet existant.

  2. Configurez les options de compilation à l'exécution dans Startup.ConfigureServices :

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    
        services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
        {
            var libraryPath = Path.GetFullPath(
                Path.Combine(HostEnvironment.ContentRootPath, "..", "MyClassLib"));
            options.FileProviders.Add(new PhysicalFileProvider(libraryPath));
        });
    }
    

    Dans le code précédent, un chemin d’accès absolu au RCL MyClassLib est construit. L’API PhysicalFileProvider est utilisée pour localiser les répertoires et les fichiers à ce chemin d’accès absolu. Enfin, l’instance PhysicalFileProvider est ajoutée à une collection de fournisseurs de fichiers, ce qui permet d’accéder aux fichiers .cshtml du RCL.

Ressources supplémentaires