带有参数的 Blazor 服务器页面在手动刷新时抛出“404 not found”
Blazor server page with parameters throwing "404 not found " on manual refreshes
我有一个 Blazor Server 应用程序,其页面在 uri 中接收参数。当我单击具有路由设置的锚标记以使用参数(如下所示)访问该页面时,link 工作正常,页面加载。
<a href="/MyPage/{@Param1}/{@Param2}"> <!--link content in here--> </a>
但是,如果尝试从 url 直接访问页面,或在浏览器中手动刷新,则页面不会重新初始化或在参数上设置任何断点。相反,它会抛出 404 未找到。
这里有两件事:
- 首先,我很困惑为什么它在锚标签内工作正常,但以其他方式死掉。特别是当
@page
指令中没有参数的页面与 refreshes/direct-urls. 一起工作时
- 其次,这是 Blazor Server 的预期行为还是我在这里遗漏了一些破坏页面的东西 refreshes/hitting-url-directly?看起来不像是一项功能,但也许我误解了 Blazor 的路由。
Razor 和 Razor.cs 相关页面:
@page "/MyPage/{Param1}/{Param2}"
<h1>MyPage</h1>
<Metrics Param1="@Param1" />
<Details Param1="@Param1" Param2="@Param2" />
<InProgress Param1="@Param1" Param2="@Param2" />
<InQueue Param1="@Param1" />
<br />
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Components;
using MyApp.Data.Models.ApiResponse;
namespace MyApp.Pages
{
public partial class MyPage
{
[Parameter]
public string Param1 { get; set; }
[Parameter]
public string Param2{ get; set; }
public TaskList Tasks { get; set; }
protected override Task OnInitializedAsync()
{
// work in progress, intend to do more here later on
var test = "";
return base.OnInitializedAsync();
}
}
}
编辑 -- 根据评论建议
Startup.cs 中 Configure 方法的 UseEndpoints 部分:
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
进一步挖掘后,我注意到 @param2 偶尔会有一个 .
字符。 Blazor 确实需要配置具有 params with dots in them 的路由。以下回退不起作用:
endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/MyPage");
它抛出一个:
InvalidOperationException: Cannot find the fallback endpoint specified by route values: { page: /MyPage, area: }.
我猜 area:
为空是个问题,但我找不到正确设置它的方法或位置。 link 中的示例仅显示后备页面的名称。有人可以指出这种回退有什么问题以及如何正确纠正它吗?
我的问题是参数值中有一个点字符。当路由问题来自参数中的“点”时,完全按照 docs 的建议进行操作(见图)。您需要像这样为该特定路由指定回退:
endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/_Host");
对于 WASM 项目:您想要指定 html 文件与 _Host,它应该是特定于 Blazor 服务器的。
endpoints.MapFallbackToFile("/MyPage/{Param1}/{Param2}", "index.html");
应用此设置后,刷新页面或直接到达 URL 应该会导致您的应用程序按预期工作,不再有 404 错误不同于 App.razor
.
要点:
- 检查您的 url 参数是否有任何已知的解析异常,例如点(Blazor 假设这些是被请求的文件)
- 使用您的应用程序的默认页面作为回退,而不是您要点击的页面。在服务器应用程序中,wasm
_Host
是 index.html
我有一个 Blazor Server 应用程序,其页面在 uri 中接收参数。当我单击具有路由设置的锚标记以使用参数(如下所示)访问该页面时,link 工作正常,页面加载。
<a href="/MyPage/{@Param1}/{@Param2}"> <!--link content in here--> </a>
但是,如果尝试从 url 直接访问页面,或在浏览器中手动刷新,则页面不会重新初始化或在参数上设置任何断点。相反,它会抛出 404 未找到。
这里有两件事:
- 首先,我很困惑为什么它在锚标签内工作正常,但以其他方式死掉。特别是当
@page
指令中没有参数的页面与 refreshes/direct-urls. 一起工作时
- 其次,这是 Blazor Server 的预期行为还是我在这里遗漏了一些破坏页面的东西 refreshes/hitting-url-directly?看起来不像是一项功能,但也许我误解了 Blazor 的路由。
Razor 和 Razor.cs 相关页面:
@page "/MyPage/{Param1}/{Param2}"
<h1>MyPage</h1>
<Metrics Param1="@Param1" />
<Details Param1="@Param1" Param2="@Param2" />
<InProgress Param1="@Param1" Param2="@Param2" />
<InQueue Param1="@Param1" />
<br />
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Components;
using MyApp.Data.Models.ApiResponse;
namespace MyApp.Pages
{
public partial class MyPage
{
[Parameter]
public string Param1 { get; set; }
[Parameter]
public string Param2{ get; set; }
public TaskList Tasks { get; set; }
protected override Task OnInitializedAsync()
{
// work in progress, intend to do more here later on
var test = "";
return base.OnInitializedAsync();
}
}
}
编辑 -- 根据评论建议
Startup.cs 中 Configure 方法的 UseEndpoints 部分:
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
进一步挖掘后,我注意到 @param2 偶尔会有一个 .
字符。 Blazor 确实需要配置具有 params with dots in them 的路由。以下回退不起作用:
endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/MyPage");
它抛出一个:
InvalidOperationException: Cannot find the fallback endpoint specified by route values: { page: /MyPage, area: }.
我猜 area:
为空是个问题,但我找不到正确设置它的方法或位置。 link 中的示例仅显示后备页面的名称。有人可以指出这种回退有什么问题以及如何正确纠正它吗?
我的问题是参数值中有一个点字符。当路由问题来自参数中的“点”时,完全按照 docs 的建议进行操作(见图)。您需要像这样为该特定路由指定回退:
endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/_Host");
对于 WASM 项目:您想要指定 html 文件与 _Host,它应该是特定于 Blazor 服务器的。
endpoints.MapFallbackToFile("/MyPage/{Param1}/{Param2}", "index.html");
应用此设置后,刷新页面或直接到达 URL 应该会导致您的应用程序按预期工作,不再有 404 错误不同于 App.razor
.
要点:
- 检查您的 url 参数是否有任何已知的解析异常,例如点(Blazor 假设这些是被请求的文件)
- 使用您的应用程序的默认页面作为回退,而不是您要点击的页面。在服务器应用程序中,wasm
_Host
是index.html