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:
- No se admite para los componentes Razor de las aplicaciones Blazor.
- No admite directivas using globales.
- No admite directivas using implícitas.
- Deshabilita la Recarga activa de .NET.
- Se recomienda para el desarrollo, no para la producció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:
Instala el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Llama 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:
Instala el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Llama 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:
- Instala el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Modifica la sección
environmentVariables
del perfil de inicio enlaunchSettings.json
:Comprobar que
ASPNETCORE_ENVIRONMENT
está establecido en"Development"
.Establece
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
en"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
. Por ejemplo, el siguientelaunchSettings.json
habilita la compilación en tiempo de ejecución para los perfiles de inicioViewCompilationSample
yIIS 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 de Razor
Considera 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:
Habilita la compilación en tiempo de ejecución con las instrucciones de Habilitación condicional de la compilación en tiempo de ejecución.
Configura 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:
- Seleccione la plantilla del proyecto Aplicación web o Aplicación web (Modelo-Vista-Controlador).
- 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:
Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
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:
- Instale el paquete NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Modifique la sección perfil
environmentVariables
de inicio enlaunchSettings.json
:- Compruebe que
ASPNETCORE_ENVIRONMENT
se establece en"Development"
. - Establezca
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
en"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
.
- Compruebe que
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 de Razor
Considera 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:
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.
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.