Compilación de archivos de Razor en ASP.NET Core

Los archivos de Razor con una extensión .cshtml se compilan en tiempo de compilación y publicación mediante el SDK de Razor. La compilación en tiempo de ejecución se puede habilitar opcionalmente mediante la configuración del proyecto.

Nota:

Compilación en tiempo de ejecución:

Compilación Razor

El SDK de Razor habilita de forma predeterminada la compilación en tiempo de compilación y la compilación en tiempo de publicación de los archivos Razor. Cuando se habilita, la compilación en tiempo de ejecución complementa la compilación en tiempo de compilación, lo que permite actualizar los archivos Razor si se editan mientras se ejecuta la aplicación.

La actualización de vistas Razor y Razor Pages durante el desarrollo mientras se ejecuta la aplicación también se admite mediante Recarga activa .NET.

Nota:

Cuando está habilitada, la compilación en tiempo de ejecución deshabilita la Recarga activa de .NET. Se recomienda usar la Recarga activa en lugar de la compilación en tiempo de ejecución Razor durante el desarrollo.

Habilitación de la compilación en tiempo de ejecución para todos los entornos

Para habilitar la compilación en tiempo de ejecución para todos los entornos:

  1. Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. Llame a AddRazorRuntimeCompilation en Program.cs:

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

Habilitación condicional de la compilación en tiempo de ejecución

La compilación en tiempo de ejecución se puede habilitar condicionalmente, lo que garantiza que la salida publicada:

  • Usa vistas precompiladas.
  • No habilita monitores de archivos en producción.

Para habilitar la compilación en tiempo de ejecución solo para el entorno de Desarrollo:

  1. Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. Llame a AddRazorRuntimeCompilation en Program.cs cuando el entorno actual esté establecido en Desarrollo:

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

La compilación en tiempo de ejecución también se puede habilitar con un ensamblado de inicio de hospedaje. Para habilitar la compilación en tiempo de ejecución en el entorno de Desarrollo para perfiles de inicio específicos:

  1. Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Modifique la sección environmentVariables del perfil de inicio en launchSettings.json:
    • Comprobar que ASPNETCORE_ENVIRONMENT está establecido en "Development".

    • Establezca ASPNETCORE_HOSTINGSTARTUPASSEMBLIES en "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation". Por ejemplo, el siguiente launchSettings.json habilita la compilación en tiempo de ejecución para los perfiles de inicio ViewCompilationSample y 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"
            }
          }
        }
      }
      

Con este enfoque, no se necesitan cambios de código en Program.cs. En tiempo de ejecución, ASP.NET Core busca un atributo HostingStartup de nivel de ensamblado en Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. El atributo HostingStartup especifica el código de inicio de la aplicación que se va a ejecutar y ese código de inicio permite la compilación en tiempo de ejecución.

Habilitación de la compilación en tiempo de ejecución para una Biblioteca de clases Razor

Considere un escenario en el que un proyecto de Razor Pages hace referencia a una biblioteca de clases de Razor (RCL) denominada MyClassLib. La RCL contiene un archivo _Layout.cshtml consumido por los proyectos de MVC y Razor Pages. Para habilitar la compilación en tiempo de ejecución para el archivo _Layout.cshtml en esa RCL, realice los siguientes cambios en el proyecto Razor Pages:

  1. Habilite la compilación en tiempo de ejecución con las instrucciones de Habilitación condicional de la compilación en tiempo de ejecución.

  2. Configure MvcRazorRuntimeCompilationOptions en 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));
    });
    

    El código anterior crea una ruta de acceso absoluta a la RLC MyClassLib. La API PhysicalFileProvider se usa para buscar directorios y archivos en esa ruta de acceso absoluta. Por último, la instancia PhysicalFileProvider se agrega a una colección de proveedores de archivos, que permite el acceso a los archivos .cshtml de la RCL.

Recursos adicionales

Los archivos de Razor con una extensión .cshtml se compilan en tiempo de compilación y publicación mediante el SDK de Razor. La compilación en tiempo de ejecución se puede habilitar opcionalmente mediante la configuración del proyecto.

Compilación Razor

El SDK de Razor habilita de forma predeterminada la compilación en tiempo de compilación y la compilación en tiempo de publicación de los archivos Razor. Cuando se habilita la compilación en tiempo de ejecución, complementa a la de tiempo de compilación y permite que se actualicen los archivos de Razor si se modifican.

Habilitación de la compilación en tiempo de ejecución en la creación del proyecto

Las plantillas de proyecto de Razor Pages y MVC incluyen una opción para habilitar la compilación en tiempo de ejecución cuando se crea el proyecto. Esta opción se admite en ASP.NET Core 3.1 y versiones posteriores.

En el cuadro de diálogo Crear una aplicación web ASP.NET Core:

  1. Seleccione la plantilla del proyecto Aplicación web o Aplicación web (Modelo-Vista-Controlador).
  2. Active la casilla Habilitar compilación en tiempo de ejecución Razor.

Habilitación de la compilación en tiempo de ejecución en un proyecto existente

Para habilitar la compilación en tiempo de ejecución para todos los entornos de un proyecto existente:

  1. Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

  2. Actualizar el método Startup.ConfigureServices del proyecto para incluir una llamada a AddRazorRuntimeCompilation. Por ejemplo:

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

Habilitar condicionalmente la compilación en tiempo de ejecución en un proyecto existente

La compilación en tiempo de ejecución se puede habilitar para que solo esté disponible para el desarrollo local. Este modo de habilitación condicional garantiza que la salida publicada:

  • Usa vistas precompiladas.
  • No habilita monitores de archivos en producción.

Para habilitar la compilación en tiempo de ejecución solo en el entorno de Desarrollo:

  1. Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Modifique la sección perfil environmentVariables de inicio en launchSettings.json:
    • Compruebe que ASPNETCORE_ENVIRONMENT se establece en "Development".
    • Establezca ASPNETCORE_HOSTINGSTARTUPASSEMBLIES en "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation".

En el ejemplo siguiente, la compilación en tiempo de ejecución está habilitada en el entorno de Desarrollo para los perfiles de inicio IIS Express y 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"
        }
      }
    }
  }

No se necesitan cambios de código en la clase Startup del proyecto. En tiempo de ejecución, ASP.NET Core busca un atributo HostingStartup de nivel de ensamblado en Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. El atributo HostingStartup especifica el código de inicio de la aplicación que se va a ejecutar. Ese código de inicio habilita la compilación en tiempo de ejecución.

Habilitación de la compilación en tiempo de ejecución para una Biblioteca de clases Razor

Considere un escenario en el que un proyecto de Razor Pages hace referencia a una biblioteca de clases de Razor (RCL) denominada MyClassLib. La RCL contiene un archivo _Layout.cshtml que consumen todos los proyectos MVC y Razor Pages de su equipo. Quiere habilitar la compilación en tiempo de ejecución para el archivo _Layout.cshtml en esa RCL. Realice los cambios siguientes en el proyecto de Razor Pages:

  1. Habilite la compilación en tiempo de ejecución con las instrucciones de Habilitación condicional de la compilación en tiempo de ejecución en un proyecto existente.

  2. Configure las opciones de compilación en tiempo de ejecución en 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));
        });
    }
    

    En el código anterior, se construye una ruta de acceso absoluta a la RCL MyClassLib. La API PhysicalFileProvider se usa para buscar directorios y archivos en esa ruta de acceso absoluta. Por último, la instancia PhysicalFileProvider se agrega a una colección de proveedores de archivos, que permite el acceso a los archivos .cshtml de la RCL.

Recursos adicionales