Blazor Шаблонные компоненты CascadingValue - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь получить значение context.Id (первичного ключа) в моем шаблонном компоненте через [CascadingParameter], поэтому я могу использовать его в своем NavigationManager. Но он всегда возвращает 0. Как я могу выполнить sh это?

Большое спасибо!

@typeparam TItem
@inject NavigationManager nav

<table class="table">
    <thead>
        <tr>@TableHeader</tr>
    </thead>
    <tbody>
        @foreach (var item in Items)
        {
            <tr @onclick="@(() => nav.NavigateTo($"dossiers/{PK}/basisgegevens"))">@RowTemplate(item)</tr>
        }
    </tbody>
    <tfoot>
        <tr>@TableFooter</tr>
    </tfoot>
</table>

@code {
    [Parameter] public List<TItem> Items { get; set; }
    [Parameter] public RenderFragment TableHeader { get; set; }
    [Parameter] public RenderFragment<TItem> RowTemplate { get; set; }
    [Parameter] public RenderFragment TableFooter { get; set; }

    [CascadingParameter] int PK { get; set; }

}

Реализация:

<GenericTable Items="dossiers">
    <TableHeader>
        <th>ID</th>
        <th>Naam</th>
        <th>Vorm</th>
        <th>Ondernemingsnummer</th>
    </TableHeader>
    <RowTemplate>
        <CascadingValue Value="@context.Id">
            <td>@context.Id</td>
            <td>@context.Name</td>
            <td>@context.LegalEntityType.Name</td>
            <td>@context.Ondernemingsnummer</td>
        </CascadingValue>
    </RowTemplate>
</GenericTable>

Ответы [ 2 ]

1 голос
/ 08 января 2020

Вы не должны использовать CascadingValue, чтобы каскадировать значения к компоненту, который, возможно, уже отрисован. Значение всегда будет нулевым. Когда компонент создан, его параметры устанавливаются в самом начале, до того, как параметру Value компонента CascadingValue будет присвоен "@ context.Id", так что теперь уже слишком поздно.

Лучшее решение, которое я мог бы найти, это переместить элемент tr в шаблон RowTemplate следующим образом:

<tbody>
    @foreach (var item in Items)
    {
        @RowTemplate(item)
    }
</tbody>

И

<RowTemplate>
   <tr @onclick="@(() => 
            nav.NavigateTo($"dossiers/{context.Id}/basisgegevens"))">
        <td>@context.Id</td>
        <td>@context.Name</td>
        <td>@context.LegalEntityType.Name</td>
        <td>@context.Ondernemingsnummer</td>
   </tr> 
</RowTemplate>

Это должно работать. Боюсь, что нет никакого способа преобразовать объект generi c в его базовый тип. Я сделаю мое расследование, и я сообщу здесь свои выводы.

0 голосов
/ 06 апреля 2020

Мне удалось go значение Id, используя Reflection:

@typeparam TItem
@inject NavigationManager nav

<table class="table">
    <thead>
        <tr>@TableHeader</tr>
    </thead>
    <tbody>
        @foreach (var item in Items)
        {
            <tr @onclick="@(() => nav.NavigateTo($"dossiers/{item.GetType().GetProperty("Id").GetValue(item, null)}/basisgegevens"))">
                @RowTemplate(item)
            </tr>
        }
    </tbody>
    <tfoot>
        <tr>@TableFooter</tr>
    </tfoot>
</table>

@code {
    [Parameter] public List<TItem> Items { get; set; }
    [Parameter] public RenderFragment TableHeader { get; set; }
    [Parameter] public RenderFragment<TItem> RowTemplate { get; set; }
    [Parameter] public RenderFragment TableFooter { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...