Il s'est avéré que c'est assez facile à faire. Aspnet Prjoect possède un outil interne appelé RazorPageGenerator
(voir https://github.com/aspnet/Razor/tree/dev/src/RazorPageGenerator) qui peut être utilisé pour compiler des vues. Après compilation avec cet outil nous aurons des classes normales qui peuvent être utilisées dans les middlewares.
Mais avant d'avoir besoin de RazorPageGenerator et de le personnaliser légèrement.
1.Créez un nouveau projet de console
dotnet new console -o MyRazorGenerator
2.Put NuGet.config dans ce dossier
<configuration>
<config>
<add key="globalPackagesFolder" value="./packages" />
</config>
<packageSources>
<add key="aspnetcore-dev" value="https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json " />
</packageSources>
</configuration>
3.Ajouter ce qui suit dans csprj (comme dotnet add package
ne prend pas en charge l'installation de pré paquets -prelease)
<ItemGroup>
<PackageReference Include="RazorPageGenerator" Version="2.1.0-*" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="2.1.0-*" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="2.1.0-*" />
</ItemGroup>
4.restore dotnet restore
pour vérifier que vous avez Raz orPageGenerator
5.Ajouter en Program.cs
:
public static int Main(string[] args)
{
if (args == null || args.Length < 1)
{
Console.WriteLine("Invalid argument(s).");
return 1;
}
var rootNamespace = args[0];
var targetProjectDirectory = args.Length > 1 ? args[1] : Directory.GetCurrentDirectory();
var razorEngine = RazorPageGenerator.Program.CreateRazorEngine(rootNamespace, builder => {
FunctionsDirective.Register(builder);
InheritsDirective.Register(builder);
SectionDirective.Register(builder);
});
var results = RazorPageGenerator.Program.MainCore(razorEngine, targetProjectDirectory);
foreach (var result in results)
{
File.WriteAllText(result.FilePath, result.GeneratedCode);
}
Console.WriteLine();
Console.WriteLine($"{results.Count} files successfully generated.");
Console.WriteLine();
return 0;
}
6.Now nous avons notre propre générateur et permet de compiler des vues
7.Create un rasoir Voir (.cshtml)
8.lancer notre générateur de compiler vue:
dotnet run --project .\MyRazorPageGenerator\MyRazorPageGenerator.csproj Croc.XFW3.Web .\Middleware
ici, je suppose que la vue est à l'intérieur dossier Middleware\Views
.
9.Generator crée un fichier comme ErrorPage.Designer.cs (si vue était ErrorPage.cshtml) que nous pouvons utiliser:
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
if (context.Response.StatusCode == StatusCodes.Status404NotFound)
{
var statusCodeFeature = context.Features.Get<IStatusCodePagesFeature>();
if (statusCodeFeature == null || !statusCodeFeature.Enabled)
{
if (!context.Response.HasStarted)
{
var view = new ErrorPage(new ErrorPageModel());
await view.ExecuteAsync(context);
}
}
}
}
}
Ici, nous allons revenir à notre point de vue en cas d'erreur 404 et absense de StatusCodePagesMiddleware. Peut être utile pour l'interface utilisateur intégrée dans les bibliothèques.
Le code généré utilise du personnel qui devrait être ajouté à votre projet. Pour l'obtenir, nous devons acquérir le paquet nuget Microsoft.Extensions.RazorViews.Sources. Encore une fois, il n'est pas sur nuget.org donc nous devons l'installer à partir de https://dotnet.myget.org/feed/aspnetcore-dev/package/nuget/Microsoft.Extensions.RazorViews.Sources.
Faut-il être un intergiciel? Un filtre d'action ou de résultat peut également le faire https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters – Tseng
@Tseng principalement parce qu'il est plus robuste (le middleware peut être le premier en pipeline) et en raison de la nécessité de gérer les erreurs comme 404 (ils ne sont pas des exceptions, donc le filtre mvc les ignorera) – Shrike