在Blazor中,是否可以为父组件和子组件指定两个不同的类型参数值?

10
请参考以下代码块。对于这些代码块,我尝试在子组件中访问父组件的值,但是子组件总是返回空值。

Component.razor:

<Parent TValue="TreeData">
 <Child TValue="TreeNode<TreeData>"></Child>
</Parent>

@code {
    public class TreeData
    {
        public string Value { get; set; }
    }
    public class TreeNode<TreeData>
    {
        public int Count { get; set; }
    }
}

Parent.razor:

<CascadingValue Value="@this">
    @ChildContent
</CascadingValue>

Child.razor:

@code {
    [CascadingParameter]
    private Parent<TValue> ParentObj { get; set; }
    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        //Parent obj always returns the null value
        ParentObj?.UpdateChildProperties("UpdateData", this);
    }    
}

1
我正在努力拼凑你的代码并创建一个可工作的示例。你能否将代码重构为父组件和子组件? - MrC aka Shaun Curtis
为什么要创建一个带有指定类类型的通用类?您必须使用公共参数来进行级联参数。 - mRizvandi
你的代码缺少@typeparam TValue,我假设它必须在父类和子类中存在。 - undefined
2个回答

1

一些需要考虑的常见事项:

  1. 确保您的子组件(或您的 _Imports.razor)对该命名空间有使用语句。
  2. 子组件中的[CascadingParameter]必须是public。
  3. 将[CascadingParameter]的类型设置为父级的名称(不包括 .razor)
  4. 如果您想要将多个不同类型作为级联参数传递,那就没有问题,只需在子级中再次创建另一个[CascadingParameter]。
  5. 如果它们需要在子组件中使用相同的[CascadingParameter],则所有被传递的类型都必须继承自同一类别(.razor)。这个 .razor 可以为空,只需确保包含 @inherits(您的基本类型)并使子级中 [CascadingParameter] 的类型为基类的类型,在初始化时可以检查类型并进行转换,如果需要的话。

我相信按照这些步骤应该可以解决这个问题,但正如Curtis在评论中提到的 - 代码分离的方式让人难以理解。


0
Parent.razor中,你使用了@this,它的类型是Parent<TreeData>
Child.razor中,你将传递的值作为一个类型为Parent<TValue>的级联参数进行捕获。根据传递的TValue = TreeNode<TreeData>,它被翻译为Parent<TreeNode<TreeData>>
级联值和级联参数的类型不匹配(Parent<TreeData>Parent<TreeNode<TreeData>>)。这就是为什么级联参数始终为空的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接