【问题标题】:ASP.NET Core MVC app can't find error page?ASP.NET Core MVC 应用找不到错误页面?
【发布时间】:2020-08-09 01:16:52
【问题描述】:

我有一个 ASP.NET Core 3.1 MVC 应用程序(不是 Razor Pages 项目),我正在尝试通过 app.UseExceptionHandle("/error") 使用 exception handling middleware 来处理异常。

似乎我可以创建自己的 MVC 错误控制器来执行此操作,但我看到了一些建议,您实际上可以在 MVC 应用程序中使用 Razor Pages。这对于像错误处理页面这样的东西可能更简单,因为它可能是一个简单的向用户显示(可能包括请求 ID),做一些日志记录,并且不需要整个控制器。在the Microsoft example 中看起来他们也在使用 Razor Pages,但那是因为他们的示例是 Razor Pages 项目。在我的 MVC 项目中,我尝试向我的 MVC 应用程序添加一个Pages 目录,并添加一个包含一些非常简单的内容的错误页面,但中间件找不到它。

~/Pages/Error.cshtml

@page

<h2>Sorry...</h2>

我不确定我是否应该在此处包含 Error.cshtml.cs 文件,因为它不是 Razor Pages 项目...我尝试将中间件路径更改为我的一个 MVC 控制器并且它起作用了:

app.UseExceptionHandler("/app/about");

...所以我认为我在路由到 Razor 页面时搞砸了一些事情,因为它针对 MVC 控制器操作路由进行了适当的重定向。

  1. 我应该能够将 Razor 页面添加到标准 MVC 项目中吗?
  2. 这是一种常见的做法,甚至是一个好主意,我应该只创建一个错误控制器吗?
  3. 有什么方法可以防止我的用户直接导航到 MVC 错误控制器路由(即 /Error)?

【问题讨论】:

    标签: asp.net-core exception middleware


    【解决方案1】:

    首先,您不需要创建单独的错误控制器。您可以在现有控制器中创建Error 操作方法,并使用相应的视图来显示自定义错误消息。

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    [Route("Error")]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    } 
    

    并配置错误处理程序路径,如下所示。

    app.UseExceptionHandler("/Controller_Name_Here/Error");
    

    此外,如果您想将 Razor Pages 集成到您现有的 MVC 应用程序中,然后配置并使用 Error.cshtml(剃须刀页面)显示自定义异常消息,您可以尝试以下步骤:

    配置 Razor 页面服务

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    
        //...
        //configure other services
        //...
    }
    

    为 Razor 页面添加端点

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        //configure custom error handling page
    
        app.UseExceptionHandler("/Error");
    
        //....
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
    
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
    

    错误页面

    @page
    @{
        ViewData["Title"] = "Error";
    }
    
    <h1>Error</h1>
    
    
    <h3>SomeThing Wrong With This Operation...</h3>
    

    【讨论】:

    • 你如何得到抛出的异常?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2018-06-10
    • 2019-02-19
    相关资源
    最近更新 更多