由于Blazor 3.1预览版2,应该可以防止Blazor中链接的默认导航行为,正如本答案中所讨论的那样。
然而,这个代码:
<NavLink href="" Match="Match" @onclick:preventDefault @onclick="()=>LinkAction()" >
Do something
</NavLink>
给出以下错误:
组件参数"onclick"用于组成部分参数必须是唯一的(不区分大小写(
为什么?
尽管HTML<A>
标记和BlazorNavLink
组件的最终结果大致相同,但@onclick:preventDefault
语法仅适用于HTML版本,而不适用于Blazor组件。
Steve Sanderson在这里解释道:
恐怕没有通过任意指令属性,如@*:preventDefault作为组件参数,因此这在NavLink上不起作用。
Steve还给出了一个可能的解决方案:
但是,您可以从NavLink继承自己的子类"防止默认"行为。例如,创建NavLinkPreventDefault.razor,包含以下内容:
@inherits NavLink <a @attributes="@AdditionalAttributes" class="@CssClass" @onclick:preventDefault> @ChildContent </a>
现在您可以使用而不是获取你想要的行为。
如果删除参数href并设置@onclick,它将直接转到函数,您可以随心所欲:
<NavLink class="nav-link" Match="NavLinkMatch.Prefix" @onclick="() => SetToActive(item)">
<span class="pcoded-micon">
<b class="fa-custom fas fa-bars @item.Icon"></b>
</span>
<span class="pcoded-mtext">@item.Title</span>
</NavLink>
这将调用方法,在那里您可以调用路由:
private void SetToActive(CoolModel item)
{
// do something...
if (item.Route is not null)
{
_navigationManager.NavigateTo(item.Route);
}
}