如果http GetById返回404

时间:2019-12-10 15:17:35

标签: blazor blazor-client-side

假设我具有以下路由模式

  • CustomerListComponent :包含客户列表
  • CustomerDetailComponent :保存特定客户的详细信息

使用路线

  • @页面“客户”

  • @page“客户/ {id:int}

和类似的路由器设置:

<Router AppAssembly="typeof(Startup).Assembly">
    <Found Context="routeData">
        ....
    </Found>
    <NotFound>
        <p>Sorry, there's nothing at this address.</p>
    </NotFound>
</Router>

如果NotFound调用未找到具有传递给{{1}的ID的客户,我希望页面重定向到http页面}

现在在我的组件内部

URL

现在看来,URL中的任何有效整数都将打开CustomerDetail组件,并且当它尝试显示Customer详细信息时,它将(显然)崩溃并显示为protected override async Task OnInitializedAsync() { var customer = await CustomerService.GetById(customerId); if (customer == null) { // redirect to 404 NOTFOUND } }

我缺少明显的东西吗?

编辑::我尝试加载自定义404页面并处理我的http服务中的导航,但是这导致浏览器中的URL更改。我想保留错误的URL,然后仍然导航到404页面。

1 个答案:

答案 0 :(得分:2)

您可以使用NavigationManager

@inject NavigationManager _nagigationManager;
...
@code {
    protected override async Task OnInitializedAsync()
    {
       var customer = await CustomerService.GetById(customerId);
       if (customer == null) 
       {
          _navigationManager.NavigateTo("404page");
       }
   }
}

如果您希望停留在同一页面上,但显示错误页面的内容,只需在html代码中添加组件:

@if(_notFound) 
{
    <NotFoundPage />
}
else
{
...
}
@code {
    private bool _notFound;
    protected override async Task OnInitializedAsync()
    {
       var customer = await CustomerService.GetById(customerId);
       if (customer == null) 
       {
          _notFound = true;
          StateHasChanged();
       }
   }
}