将参数传递到Blazor组件

时间:2020-10-03 11:45:24

标签: c# asp.net-core blazor blazor-server-side blazor-client-side

我想不出如何实现以下目标:

我需要将参数集合(或数组)传递给我的Blazor组件。传递的参数是Blazor组件。参数的集合必须作为嵌套标记传递。必须能够分别调用每个传递的参数组件的呈现。

也就是说,我想要这样的东西:

<MyComponent>
  <ParameterCollection>
    <MyParameterComponent1>Caption1</MyParameterComponent1>
    <MyParameterComponent2>Caption2</MyParameterComponent2>
    <MyParameterComponent3>Caption3</MyParameterComponent3>
  </ParameterCollection>
</MyComponent>

MyComponent代码:

@code{
    [Parameter]
    public RenderFragment[] ParameterCollection {get; set;} //Runtime error
}

我想得到的显然是在commercial Blazor component处实现的(选择VIEW SOURCE选项卡)。 GridColumns参数传递给GridColumn组件的集合。我认为更准确地说,它是它们对应的RenderFragments的集合。 问题是如何完成?

2 个答案:

答案 0 :(得分:5)

Blazor无法获取渲染片段的集合作为参数。您可以通过两种不同的方法将动态组件计数作为参数传递

  1. 如果您只想传递多个组件,但可以通过与传递它们相同的顺序来渲染它们:
<MyComponent>
    <ParameterCollection>
        <MyParameterComponent1>Caption1</MyParameterComponent1>
        <MyParameterComponent2>Caption2</MyParameterComponent2>
        <MyParameterComponent3>Caption3</MyParameterComponent3>
    </ParameterCollection>
</MyComponent>
@code{
    [Parameter]
    public RenderFragment ParameterCollection {get; set;} 
}

,您可以渲染它们,将@ParameterCollection放置在.razor文件中的任何位置。

以下是此方法的一个有效示例:https://blazorrepl.com/repl/QaFEadlQ52kWHVkX13

  1. 当您希望同时计算两个动态组件并且想要控制它们的放置位置时。

在这种方法中,您仅使用该组件传递一些元数据-类似于@Henk Holterman的建议:

<MyComponent>
    <ParameterCollection>
        <MyParameterComponent1>Caption1</MyParameterComponent1>
        <MyParameterComponent2>Caption2</MyParameterComponent2>
        <MyParameterComponent3>Caption3</MyParameterComponent3>
    </ParameterCollection>
</MyComponent>
@code{
    [Parameter]
    public RenderFragment ParameterCollection {get; set;} 
}

这样,您可以将@ParameterCollection放在.razor文件的开头,该文件包装在Parent组件的CascadingValue中。这将触发所有子组件的渲染。

在每个组件的初始化中,您需要触发向父级填充元数据:

@code {
    [CascadingParameter]
    private MyComponent Parent { get; set; }
    protected override void OnInitialized()
    {
        if (Parent != null)  Parent.AddChild(this);    
    }
}

收到元数据后,您只需再次触发渲染并在

中使用此数据

这是一个有效的示例:https://blazorrepl.com/repl/wuPOOxvd06vFcWFG21

答案 1 :(得分:4)

转过来:DatagGridColumnCollection组件将自己插入为CascadingValue,而DatagGridColumn组件仅调用Add方法。

ColumnCollection

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

@code
{ 
    public void Add(DataGridColumn colum) { ... }
}

DataGridColumn

@code {
  [CascadingParameter]
  private ColumnCollection Parent { get; set; }
  protected override void OnInitialized()
  {
    if (Parent != null)  Parent.Add(this);    
  }
}