gpt4 book ai didi

razor - aspnetcore : how to return a view from middleware

转载 作者:行者123 更新时间:2023-12-04 12:04:10 25 4
gpt4 key购买 nike

我正在为aspnetcore2.0 的中间件工作,我想在其中执行一些 Razor View 。
实际上我需要一个错误处理中间件,它可以从 Razor View 中显示漂亮的页面。我知道有可能与 UseStatusCodePagesWithReExecute基于状态码。但我需要一种更通用的方法 - 在我的中间件中处理异常以将其(在某些情况下)委托(delegate)给错误 View 。

我意识到 DeveloperExceptionPageMiddleware做一些类似于我需要的事情。但是即使在深入研究其来源之后,我也无法理解它是如何工作的。

这是该中间件返回 View 的地方 - https://github.com/aspnet/Diagnostics/blob/dev/src/Microsoft.AspNetCore.Diagnostics/DeveloperExceptionPage/DeveloperExceptionPageMiddleware.cs#L206

但我无法理解这是一种什么样的看法。它既不是 Razor 页面(因为它没有 @page 指令)也不是 mvc View (但我不确定)。

在项目中,该 View 有两个文件:ErrorPage.cshtmlErrorPage.Designer.cs . Designer.cs 是如何创建的?它看起来像一个生成的文件。但多亏了它,项目中有一个普通类(ErrorPage),可以显式使用。它继承了 Microsoft.Extensions.RazorViews.BaseView来自 Microsoft.Extensions.RazorViews.Sources 的类(class)包裹。

所以中间件只是执行那个 View :

var errorPage = new ErrorPage(model);
return errorPage.ExecuteAsync(context);

如何在我的项目中实现它?

最佳答案

更新 [2018.06]:请注意,这篇文章是为 .NET Core 2.0 编写的,在 .NET Core 2.1 中对 RazorEngine 进行了重大更改。

事实证明,这很容易做到。
Aspnet prjoect 有一个名为 RazorPageGenerator 的内部工具。 (见 https://github.com/aspnet/Razor/tree/dev/src/RazorPageGenerator )可用于编译 View 。使用此工具编译后,我们将获得可用于中间件的普通类。

但在我们需要获取 RazorPageGenerator 并稍微自定义它之前。

1.新建一个控制台项目

dotnet new console -o MyRazorGenerator

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>

3.在csprj中添加以下内容(因为 dotnet add package不支持安装预发布包)
<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.恢复 dotnet restore检查你有 RazorPageGenerator

5.加入 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.现在我们有了自己的生成器,可以编译 View 了

7.创建 Razor View (.cshtml)

8.运行我们的生成器编译 View :
dotnet run --project .\MyRazorPageGenerator\MyRazorPageGenerator.csproj Croc.XFW3.Web .\Middleware

在这里,我假设 View 位于 Middleware\Views 内部文件夹。

9.Generator 创建一个类似 ErrorPage.Designer.cs 的文件(如果 View 是 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,我们将返回我们的 View 。可用于库中的嵌入式 UI。

生成的代码使用应添加到项目中的人员。要获得它,我们需要获取 nuget 包 Microsoft.Extensions.RazorViews.Sources。同样它不在 nuget.org 上,所以我们需要从 https://dotnet.myget.org/feed/aspnetcore-dev/package/nuget/Microsoft.Extensions.RazorViews.Sources 安装它.

关于razor - aspnetcore : how to return a view from middleware,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com