我有一个使用Blazor Server的应用程序,其中一个页面在URI中接收参数。当我单击具有路由设置以带有参数命中该页面的锚标记(如下所示)时,链接正常工作,并且页面加载。
然而,如果直接从该URL访问页面或在浏览器中手动刷新页面,则页面不会重新初始化或命中任何参数上的断点。相反,它会抛出404未找到错误。
因此,有两个问题:
首先,我对为什么从锚标签内部正常工作但以其他方式运行感到困惑。特别是当没有在@page指令中使用params的页面可以通过刷新/直接URL正常工作时。
其次,这是Blazor Server的预期行为还是我错过了某些东西,导致页面刷新/直接URL失败?似乎不是一个功能,但也许我误解了Blazor的路由。
涉及页面的Razor和Razor.cs:
进一步调查后,我注意到 @param2 中偶尔会有一个
<a href="/MyPage/{@Param1}/{@Param2}"> <!--link content in here--> </a>
然而,如果直接从该URL访问页面或在浏览器中手动刷新页面,则页面不会重新初始化或命中任何参数上的断点。相反,它会抛出404未找到错误。
因此,有两个问题:
首先,我对为什么从锚标签内部正常工作但以其他方式运行感到困惑。特别是当没有在@page指令中使用params的页面可以通过刷新/直接URL正常工作时。
其次,这是Blazor Server的预期行为还是我错过了某些东西,导致页面刷新/直接URL失败?似乎不是一个功能,但也许我误解了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:
为空是一个问题,但我找不到在哪里或如何正确地设置它。链接中的示例仅显示页面名称作为回退。请问有人能指出这个回退的问题在哪里以及如何正确地纠正它吗?
@param2
中偶尔会有句号。然而,备用方案似乎没有起作用 - 我将在一分钟内更新问题以反映这一点。 - CoderLee