从 Blazor(服务器端)动态组合路由中的@ondblclick 事件处理程序导航

Navigate from @ondblclick event handler in Blazor (Server-Side) composing route dynamically

我正在尝试从服务器端 Blazor 上某个元素上的 @ondblclick 处理程序进行导航,尝试为每一行打开一个详细信息页面。 这是相关代码:

@inject NavigationManager nm
...
@for (var elem in elements)
{
    <tr @ondblclick="@(() => nm.NavigateTo("Cuenta/" + elem.Id.ToString()))">
    ...
    </tr>
}

但我总是遇到这个异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot implicitly convert type 'void' to 'object''

我也试过这种方法:

<tr @ondblclick="@(() => nm.NavigateTo("Cuenta/" + @elem.Id.ToString()))">
<tr @ondblclick="nm.NavigateTo("Cuenta/" + elem.Id.ToString())">
<tr @ondblclick="@(nm.NavigateTo("Cuenta/" + elem.Id.ToString())">
<tr ondblclick="@(() => nm.NavigateTo("Cuenta/" + elem.Id.ToString()))">

可能还有其他人,但 none 似乎是正确的,但奇怪的是,如果我执行以下操作,它会起作用(但它不可用=:

 <tr @ondblclick="@(() => nm.NavigateTo("Cuenta/123"))">

那么,如何使用导航管理器直接从模板导航?

编辑: 这似乎与 "elem" 是一个动态对象有关,因为元素是动态列表...

我认为您需要在 for 循环中实例化 elem.Id.ToString() 的新实例,例如

@inject NavigationManager nm
...
@for (var elem in elements)
{
    string tmpString  = elem.Id.ToString();
    <tr @ondblclick="@(() => nm.NavigateTo("Cuenta/" + tmpString))">
    ...
    </tr>
}

希望对您有所帮助。

这是标准的 C# 行为,与 Blazor 无关,其中 lambda 表达式 @(() => DoSomething(i)) 可以访问一个变量,不能访问它的值.您必须定义一个局部于您的循环的变量。