【问题标题】:Rendering view outside of controllerContext在 controllerContext 之外渲染视图
【发布时间】:2017-04-20 09:02:35
【问题描述】:

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

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

我知道这是一个以前被问过的问题,但找到的常见解决方案是 使用 RazorEngine (https://antaris.github.io/RazorEngine/),但它接缝处于非活动状态,并且在线示例/文档是一个更旧的版本,我无法使其工作。

很难相信没有一个简单的解决方案,比如将路径传递给 chtml 文件,以及模型+viewbag 并返回字符串。

我错过了什么吗?

【问题讨论】:

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

标签: c# asp.net asp.net-core razorengine


【解决方案1】:

已经存在由 ASP.NET Core 提供的处理这种情况的中间件。在您的 IApplicationBuilder 实例上添加 UseStatusCodePagesWithReExecute 扩展名即可访问。
我们的想法是为这个中间件配置一个专门用于错误处理的路由,该路由将返回配置的错误视图和技术信息。

在你的 Startup 的 Configure 方法中:

...
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();
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多