【问题标题】:Passing interfaces instead of concrete classes into @ChildContent's [CascadingParameter] using <CascadingValue> in blazor在 blazor 中使用 <CascadingValue> 将接口而不是具体类传递到 @ChildContent 的 [CascadingParameter]
【发布时间】:2021-04-21 05:50:26
【问题描述】:

我有 Item 实现 IItemItemContainer 实现 IItemContainer

ItemContainer.razor我有以下,将自己传递给它的所有@ChildContent

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

@code{
  List<IItem> Items;
  void AddItem(IItem item) => Items.Add(item);
  .
  .
  .
}

Item 类中,我有以下内容:

[CascadingParameter] public IItemContainer ItemContainer {get;set;}
protected override void OnInitialized()
{
  ItemContainer.AddItem(this);
}
RenderFragment RenderStuff => Do some rendering stuff with ItemContainer
.
.
.

假设我有以下内容:

<ItemContainer>
  <Item>
  <Item>
  <Item>
</ItemContainer>

我希望当第一个&lt;Item&gt; 调用它的OnInitialized 时, &lt;ItemContainer&gt; 已经将自身传递给 [CascadingParameter] public IItemContainer ItemContainer {get;set;}, 所以[CascadingParameter] public IItemContainer ItemContainer {get;set;} 不会为空, 并且ItemContainer.AddItem(this); 将被成功调用并将&lt;Item&gt; 添加到&lt;ItemContainer&gt;List&lt;IItem&gt; Items

如果我使用具体的类,例如 ItemContainer 而不是 IItemContainer for &lt;CascadingValue Value="this"&gt;,这不是问题。

但是,当&lt;CascadingValue Value="this"&gt;this 是接口而不是具体类时,不会自动进行强制转换,并且会抛出空异常(ItemContainer 未传递到级联参数中)。

当我尝试使用&lt;CascadingValue TValue="IItemContainer" Value="(IItemContainer)this"&gt; 进行强制转换时,会抛出异常。

我想将接口而不是具体类传递给级联参数。有没有办法让这个工作?

【问题讨论】:

    标签: c# asp.net-core interface refactoring blazor


    【解决方案1】:

    当我尝试使用

    <CascadingValue TValue="IItemContainer" 
      Value="(IItemContainer)this">
    

    会抛出异常。

    你不这样做。你还是要通过this

    方法如下:

    ItemContainer.razor

    <CascadingValue Value="this">
        @ChildContent
    </CascadingValue>
    
    @code{
      List<IItem> Items;
      void AddItem(IItem item) => Items.Add(item);
      .
      .
      .
    }
    

    Item.razor

    @implements IItem
     
    [CascadingParameter] public IItemContainer ItemContainer {get;set;}
    
    protected override void OnInitialized()
    {
        // Note: The first ItemContainer (left to right) is the class name,
        // the second is the name of the cascading parameter property. If the compiler
        // fail to recognize that (I guess she won't), change this property to 
        // ContainerItemSet, as for instance. Otherwise, it should work perfectly 
        // fine. 
        ((ItemContainer)(object)(ItemContainer)).AddItem(this);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 2017-09-14
      • 2012-11-29
      • 2023-03-30
      • 2023-01-11
      • 2011-05-14
      • 2022-01-06
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多