【问题标题】:Blazor: Implementing 404 not found pageBlazor:实现 404 未找到页面
【发布时间】:2019-05-20 09:48:26
【问题描述】:

我想在我的应用程序内部实现一个页面,当 blazor 路由器无法找到匹配的路由时显示该页面。目前,所有请求都路由到index.html,所以我无法像往常一样通过 iis 处理错误。如果我输入了一个无效的路由,我会看到一个空白页面(实际上是index.html)并收到一个控制台错误:

'Router' cannot find any component with a route for '/some/Nonexistent/Route'.

看起来我应该能够处理这个问题,因为 blazor 路由器能够识别出没有定义的路由与请求的路由匹配,但是到目前为止我找不到任何关于此的文档。

我该如何实现呢?有没有办法连接到 blazor 路由器并将所有未找到的路由定向到预定义的错误路由?

我看到 https://github.com/aspnet/AspNetCore/issues/5489 列出了一个 404 处理程序的问题,但我不确定这是否比我想要做的更强大和生产就绪

【问题讨论】:

    标签: asp.net-core .net-core .net-core-2.0 blazor


    【解决方案1】:

    App.razor中,在<Router>下添加<NotFound>元素,设置当Blazor找不到指定路由时你想显示什么内容。

    例如:

    <Router AppAssembly="typeof(Program).Assembly">
        <NotFound>
            <h1>404 Not Found</h1>
        </NotFound>
    </Router>
    

    (注意:如果是服务器端应用程序,则为typeof(Startup).Assembly

    Source

    【讨论】:

    • 但是,这种方法会返回 404 代码吗?我刚刚测试,在浏览器中看不到 404 错误代码。 404 错误代码对于 SEO 来说非常重要。
    • @EmranHussain 似乎很难返回正确的 404 代码,但您应该能够使用依赖注入来实现它。见stackoverflow.com/a/62300957/565288
    • 有没有人为 Authorized 和 NotAuthorized 视图设置了不同的 NotFound 页面?我似乎无法让它工作......
    【解决方案2】:

    试试这个: 应用程序.cshtml

    <Router AppAssembly=typeof(Program).Assembly FallbackComponent="typeof(Error404)" >
    

    创建一个名为 Error404.cshtml 的组件

    注意:这只是我从挖掘 Router 类中收集的一个猜测。见https://github.com/aspnet/AspNetCore/blob/343208331d9ebbb3a67880133f4139bee2cb1c71/src/Components/src/Microsoft.AspNetCore.Components/Routing/Router.cs

    请告诉我它是否适合您。

    【讨论】:

    • 在启动应用程序后立即导致运行时错误:Uncaught (in promise) Error: System.InvalidOperationException: Object of type 'Microsoft.AspNetCore.Blazor.Routing.Router' does not have a property matching the name 'FallbackComponent'.,考虑到我可以在@987654327 的源文件中看到一个名为FallBackComponent 的属性标记为[Parameter],我觉得这有点奇怪@(我使用的是 Blazor v0.7.0,应该是最新的)
    • 查看该文件的历史记录,似乎FallbackComponent 是在 5 天前(2018 年 12 月 14 日)添加的。看起来它还没有包含在 blazor 版本中,即使在 dotnet.myget.org/gallery/blazor-dev 的所谓夜间构建提要中,它指向正确的 repo,他们还没有更新文档以向我们提供正确的提要对于 CI 提要,如果有的话
    • 我正在密切关注这一点,当包含此源代码的软件包可用并且我能够对其进行测试时,我会将其标记为已接受。看起来这应该可以工作
    • App.razor 中现在有一个默认的&lt;NotFound&gt; 元素。
    【解决方案3】:

    对于 SEO 足够的添加 App.razor:

    <NotFound>
            <h1>404 Not Found</h1>
            <HeadContent>
                   <meta name="robots" content="noindex" />
            </HeadContent>
    </NotFound>
    

    并实现 Sitemap.xml

    【讨论】:

      【解决方案4】:

      您可以将此链接用于 .net 5.0 blazor 服务器端应用程序。 您可以正确处理 404 和状态码

      https://stackoverflow.com/a/69404900/2123797

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-15
        • 2015-05-19
        相关资源
        最近更新 更多