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