C# 在controllerContext外部渲染视图

C# 在controllerContext外部渲染视图,c#,asp.net,asp.net-core,razorengine,C#,Asp.net,Asp.net Core,Razorengine,我有一个用.net核心mvc6编写的项目。我有一个“HideExeptionMiddleware”,它的目标是捕获抛出的异常,作为最后的手段,这些异常没有在控制器中处理,并将用户重定向到错误页面。中间件还记录这些实例,并为错误生成唯一的ID。 我的目标是将该ID以及其他“ViewBag”变量传递到Error.chtml文件,而不重定向响应 我想到的解决方案是将.chtml文件呈现为字符串,并使用 来自中间件的Response.WriteAsync 我知道以前有人问过这个问题,但找到的共同解决办法

我有一个用.net核心mvc6编写的项目。我有一个“HideExeptionMiddleware”,它的目标是捕获抛出的异常,作为最后的手段,这些异常没有在控制器中处理,并将用户重定向到错误页面。中间件还记录这些实例,并为错误生成唯一的ID。 我的目标是将该ID以及其他“ViewBag”变量传递到Error.chtml文件,而不重定向响应

我想到的解决方案是将.chtml文件呈现为字符串,并使用 来自中间件的Response.WriteAsync

我知道以前有人问过这个问题,但找到的共同解决办法是 使用RazorEngine(),但它在active和示例在线/文档中是一个旧得多的版本,我无法让它工作

很难相信没有一个简单的解决方案像传递到chtml文件的路径、model+viewbag和获取字符串那样


我遗漏了什么吗?

ASP.NET Core已经提供了一个中间件来处理这种情况。可以在您的
iaapplicationbuilder
实例上抛出
useStatusCodePageSwithExecute
扩展。
其思想是使用一条专门用于错误处理的路由来配置该中间件,该路由将返回配置好的错误视图和技术信息

在启动的配置方法中:

...
app.UseStatusCodePagesWithReExecute("/error/{0}");
...
然后定义一个ErrorController:

[Route("error")]
public class ErrorController : Controller
{
   [HttpGet("{status?}")]
   public IActionResult Index(int? status = null)
   {
        ViewBag.RequestId = HttpContext.TraceIdentifier;
        return this.View();
   }
}

我不太清楚官方的错误处理中间件到底做了什么,但它提供了重写请求的能力,这意味着它不会重定向。相反,它只是使用另一个URL再次执行中间件堆栈。我想你也可以这样做。这将使它更容易,因为您可以在查询参数中传递参数,并让MVC计算出它们。更改路径并再次调用上下文是不可能的。我收到异常“已发送邮件头”。但即使如此,我也不想将错误ID传递给操作。呈现视图需要控制器上下文,而该上下文在您的中间件中不可用。我认为
RazorEngine
是一条路要走。否则,创建一个简单的html,而不使用
Razor