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

SVB*_*hok 8 blazor blazor-server-side asp.net-blazor

请参考以下代码块。对于该代码块,我尝试将父组件值访问到子组件中,但它始终在子组件中返回空值。

<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 Component:**

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

**Child Component:** 

@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);
    }    
}
Run Code Online (Sandbox Code Playgroud)

小智 1

需要考虑的一些一般事项:

  1. 确保您的子组件(或 _Imports.razor)具有该命名空间的 using 语句。
  2. 子级中的 [CascadingParameter] 必须是公共的。
  3. 将 [CascadingParameter] 的类型设置为父级的名称(不带 the.razor)
  4. 如果您想将多种不同类型作为级联参数传递,那没问题,只需在子级中创建另一个 [CascadingParameter] 即可。
  5. 如果它们需要在子组件中使用相同的 [CascadingParameter],则所有向下传递的类型都必须从同一个类 (.razor) 继承。这个 .razor 可以为空,只需确保包含 @inherits (无论您的基本类型是什么)并将子级中的 [CascadingParameter] 类型设置为基本类型,并且在初始化时您可以检查类型并强制转换它如果需要的话。

我相信做这些事情应该可以解决这个问题,但正如柯蒂斯在评论中提到的那样 - 很难按照这段代码的分离方式来遵循它。