将参数传递给 Blazor 组件

v.a*_*a.v 2 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>
Run Code Online (Sandbox Code Playgroud)

我的组件代码:

@code{
    [Parameter]
    public RenderFragment[] ParameterCollection {get; set;} //Runtime error
}
Run Code Online (Sandbox Code Playgroud)

我想要得到的显然是在这里实现的商业 Blazor 组件(选择 VIEW SOURCE 选项卡)。GridColumns 参数被传递到 GridColumn 组件的集合。更准确地说,在我看来,它是它们对应的 RenderFragment 的集合。问题是它是如何完成的?

Hen*_*man 5

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

列集合

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

@code
{ 
    public void Add(DataGridColumn colum) { ... }
}
Run Code Online (Sandbox Code Playgroud)

数据网格列

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


Kri*_*nov 5

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

  1. 如果您只想传递多个组件,但可以按照传递它们的相同顺序呈现它们:
<MyComponent>
    <ParameterCollection>
        <MyParameterComponent1>Caption1</MyParameterComponent1>
        <MyParameterComponent2>Caption2</MyParameterComponent2>
        <MyParameterComponent3>Caption3</MyParameterComponent3>
    </ParameterCollection>
</MyComponent>
Run Code Online (Sandbox Code Playgroud)
@code{
    [Parameter]
    public RenderFragment ParameterCollection {get; set;} 
}
Run Code Online (Sandbox Code Playgroud)

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

这是这种方法的一个工作示例:https : //blazorrepl.com/repl/QaFEadlQ52kWHVkX13

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

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

<MyComponent>
    <ParameterCollection>
        <MyParameterComponent1>Caption1</MyParameterComponent1>
        <MyParameterComponent2>Caption2</MyParameterComponent2>
        <MyParameterComponent3>Caption3</MyParameterComponent3>
    </ParameterCollection>
</MyComponent>
Run Code Online (Sandbox Code Playgroud)
@code{
    [Parameter]
    public RenderFragment ParameterCollection {get; set;} 
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以将 @ParameterCollection 放在.razor文件的开头,并包装在 Parent 组件的 CascadingValue 中。这将触发所有子组件的渲染。

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

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

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

这是一个工作示例:https : //blazorrepl.com/repl/wuPOOxvd06vFcWFG21