Blazor模板化组件CascadingValue

Blazor模板化组件CascadingValue,blazor,Blazor,我试图通过[CascadingParameter]在模板化组件中获取context.Id主键值,以便在NavigationManager中使用它。但它总是返回0。 我怎样才能做到这一点 非常感谢 @typeparam TItem @inject NavigationManager nav <table class="table"> <thead> <tr>@TableHeader</tr> </thead&g

我试图通过[CascadingParameter]在模板化组件中获取context.Id主键值,以便在NavigationManager中使用它。但它总是返回0。 我怎样才能做到这一点

非常感谢

@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>

不应使用CascadingValue将值级联到可能已渲染的组件。该值将始终为零。创建组件时,其参数会在一开始就设置好,然后才为CascadingValue组件的Value参数赋值@context.Id,所以现在太晚了

我能想到的最佳解决方案是将tr元素移动到RowTemplate,如下所示:

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


这应该是有效的。恐怕没有办法将泛型对象强制转换为其底层类型。我会做我的调查,我会在这里报告我的发现

我已使用反射成功地确定了Id的值:

@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; }
}

我以前从未这样做过,但我理解这个问题。无法将TItem转换为基础对象,但应将其转换为基础对象。我将对此进行调查,并让您知道……当然,您可以暂时传递一个包含ID值的int数组……@enet感谢您的努力!对于int[]的传递,你怎么看?看我的答案。。。
@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; }
}