这是在具有每页交互性的 Blazor 服务器应用程序中。
在我的搜索页面中,我想在参数更改时更新页面url,以便可以复制链接。我的理解是,通过使用 NavigationManager Blazor 将检测到不需要完全重新加载,并跳过组件初始化。
我希望单击“开始搜索”后以下代码不会点击
OnInitialized()
。
@page "/test/{searchvalue}"
@rendermode InteractiveServer
@inject NavigationManager _NavigationManager
<InputText @bind-Value="SearchInput"></InputText>
<div @onclick="(() => Search())">Start search</div>
<br />
<br />
Test input: @SearchValue
@code{
[Parameter]
public string SearchValue { get; set; } = "";
public string SearchInput { get; set; } = "";
protected override void OnInitialized()
{
// Inital filter settings etc.
// ...
base.OnInitialized();
}
protected override void OnParametersSet()
{
SearchInput = SearchValue;
}
protected void Search()
{
_NavigationManager.NavigateTo($"/test/{SearchInput}", false, false);
}
}
这个问题主要与静态路由有关,如文档中提到的:
当交互式渲染模式分配给路由组件时, Blazor 路由器在静态 SSR 与静态 服务器上的路由。这种类型的路由称为交互式路由 路由。
静态路由器使用端点路由和 HTTP 请求路径来 确定要渲染哪个组件。当路由器变成 交互式,它使用文档的 URL(浏览器中的 URL) 地址栏)来确定要渲染哪个组件。这意味着 交互式路由器可以动态改变哪个组件 如果文档的 URL 动态更改为另一个有效的 URL,则呈现 内部 URL,并且无需执行 HTTP 请求即可执行此操作 获取新页面内容。
您没有将交互式服务器渲染模式分配给 app.razor 中的路由组件
<Routes @rendermode="InteractiveServer" />
为您设置每个组件的交互式服务器渲染模式,因此您的应用程序始终处于静态路由。