Перейдите из обработчика событий @ondblclick в Blazor (на стороне сервера), составляя маршрут динамически - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь перейти от обработчика @ondblclick к элементу на стороне сервера Blazor, пытаясь открыть страницу сведений для каждой строки. Это соответствующий код:

@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()))">

и, возможно, другие, но ни один, кажется, не является правильным, но как бы странно, если я не выполняю следующие действия, это работает (но это невозможно использовать =:

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

Итак, как я могу использовать менеджер навигацииосуществлять навигацию непосредственно из шаблона?

Редактировать: Кажется, это как-то связано с тем, что "elem" является динамическим объектом, так как элементы - это Список динамики...

1 Ответ

2 голосов
/ 04 октября 2019

Я думаю, вам нужно создать новый экземпляр elem.Id.ToString () внутри цикла for что-то вроде

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

Надеюсь, это поможет.

Это стандартПоведение C #, не связанное с Blazor, где лямбда-выражение @ (() => DoSomething (i)) имеет доступ к переменной и не к ее значению . Вы должны определить переменную, которая является локальной для вашего цикла.

...