Shr*_*ike 7 razor .net-core asp.net-core asp.net-core-2.0
我正在为aspnetcore2.0的中间件工作,我想执行一些剃刀视图.
实际上我需要一个错误处理中间件,它会从剃刀视图中显示漂亮的页面.我知道可以UseStatusCodePagesWithReExecute根据状态代码进行操作.但是我需要一种更通用的方法 - 在我的中间件中处理异常,以便将它(在某些情况下)委托给错误视图.
我意识到这DeveloperExceptionPageMiddleware与我需要的东西类似.但即使在深入研究其来源后,我也无法理解它是如何运作的.
但我无法理解它是什么样的观点.它既不是剃刀页面(因为它没有@page指令)也不是mvc视图(但我不确定).
在该项目中,该视图有两个文件:ErrorPage.cshtml和ErrorPage.Designer.cs.Designer.cs是如何创建的?它看起来像生成的文件.但是由于它在项目(ErrorPage)中有一个可以显式使用的普通类.它Microsoft.Extensions.RazorViews.BaseView从Microsoft.Extensions.RazorViews.Sources包继承类.
所以中间件只是执行该视图:
var errorPage = new ErrorPage(model);
return errorPage.ExecuteAsync(context);
Run Code Online (Sandbox Code Playgroud)
如何在我的项目中实现?
更新[2018.06]:请注意,该帖子是针对.NET Core 2.0编写的,在.NET Core 2.1中对RazorEngine进行了重大更改.
事实证明,这很容易做到.Aspnet prjoect有一个名为RazorPageGenerator(参见https://github.com/aspnet/Razor/tree/dev/src/RazorPageGenerator)的内部工具,可用于编译视图.使用此工具编译后,我们将获得可用于中间件的普通类.
但在我们需要获得RazorPageGenerator并稍微定制它之前.
1.创建一个新的控制台项目
dotnet new console -o MyRazorGenerator
Run Code Online (Sandbox Code Playgroud)
2.在此文件夹中输入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>
Run Code Online (Sandbox Code Playgroud)
3.在csprj中添加以下内容(因为dotnet add package不支持安装pre-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>
Run Code Online (Sandbox Code Playgroud)
4. dotnet restore要检查你是否有RazorPageGenerator
5.add into 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;
}
Run Code Online (Sandbox Code Playgroud)
6.现在我们有自己的生成器,可以编译视图
7.创建一个Razor视图(.cshtml)
8.运行我们的生成器来编译视图:
dotnet run --project .\MyRazorPageGenerator\MyRazorPageGenerator.csproj Croc.XFW3.Web .\Middleware
Run Code Online (Sandbox Code Playgroud)
在这里我假设视图在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);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们将返回我们的视图,以防404错误和没有StatusCodePagesMiddleware.对于libs中的嵌入式UI非常有用.
生成的代码使用应添加到项目中的人员.为了得到它,我们需要获得nuget包Microsoft.Extensions.RazorViews.Sources.再次它不在nuget.org上,所以我们需要从https://dotnet.myget.org/feed/aspnetcore-dev/package/nuget/Microsoft.Extensions.RazorViews.Sources安装它.
| 归档时间: |
|
| 查看次数: |
1644 次 |
| 最近记录: |