事實證明,這很容易做到。 ASPNET prjoect具有稱爲RazorPageGenerator
一個內部工具(見https://github.com/aspnet/Razor/tree/dev/src/RazorPageGenerator),其可以用於編譯的意見。用這個工具編譯後,我們會得到它可以在中間件使用正常上課。
但在此之前,我們需要得到RazorPageGenerator稍微定製。
1,創建一個新的控制檯項目
dotnet new console -o MyRazorGenerator
2.put NuGet.config此文件夾
<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.添加在csprj以下內(如dotnet add package
不支持預安裝-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
檢查你有拉茲orPageGenerator
5.add到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我們有我們自己的發電機,並可以編譯意見
7.Create一個Razor視圖(.cshtml)
8。運行我們的生成器來編譯視圖:
dotnet run --project .\MyRazorPageGenerator\MyRazorPageGenerator.csproj Croc.XFW3.Web .\Middleware
這裏我假設的看法是Middleware\Views
文件夾內。
9.Generator創建像ErrorPage.Designer.cs一個文件(如果觀點是ErrorPage.cshtml),我們可以使用:
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);
}
}
}
}
}
這裏,我們在404錯誤由於缺少和的情況下,回到我們的觀點StatusCodePagesMiddleware。對於libs中的嵌入式UI可能很有用。
生成的代碼使用應該添加到項目中的人員。爲了得到它,我們需要獲取nuget包Microsoft.Extensions.RazorViews.Sources。再次,它不在nuget.org上,所以我們需要從https://dotnet.myget.org/feed/aspnetcore-dev/package/nuget/Microsoft.Extensions.RazorViews.Sources進行安裝。
它是否必須是中間件?動作或結果過濾器也可能會這樣做https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters – Tseng
@Tseng主要是因爲它更健壯(中間件可以是管道中的第一個),由於需要處理像404錯誤(他們不是例外,所以mvc過濾器將忽略它們) – Shrike