Blazor-Component继承自BaseClass

时间:2020-09-29 12:22:27

标签: c# blazor blazor-server-side

我将为我的Razor-Components创建一个Base-Class。 基本类如下:

public abstract class ExampleBase : ComponentBase 
{
    public virtual void Submit()
    {
        //DoSomething
    }

    public virtual void Back()
    {
        //DoSomething else
    }
}

我的Blazor-Component继承自此类

@inherits ExampleBase

<button @onclick="Submit" />

到目前为止很好,但是当我启动我的应用程序并且此页面即将加载时,我收到异常:

[2020-09-29T12:09:03.920Z]错误:System.ArgumentException:组件类型必须实现Microsoft.AspNetCore.Components.IComponent。 在Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent(Int32序列,类型componentType)

从ComponentBase继承有什么问题?

感谢您的帮助

添加: 我这样称呼我的Razor-Component,并且在builder.OpenComponent

处引发异常
RenderFragment CreateFragment() => builder =>
{
  builder.OpenComponent(0, typeof(MyRazorComponent));
  builder.CloseComponent();
}

希望这会有所帮助

1 个答案:

答案 0 :(得分:0)

首先-谢谢大家的帮助,我非常感谢!

几个小时后休​​息。 我发现了自己的错误...

我在做什么:我创建了一个加载类型列表的服务,该服务被注入到Razor组件中。

服务代码:

//this returns a listOfRazorComponents
return AppDomain.CurrentDomain.GetAssemblies()
            .Where(x => x.FullName.StartsWith("SampleApplication")).FirstOrDefault()
            .DefinedTypes.Where(x=>x.BaseType is ComponentBase);

在我的Razor组件中,我已经显示了该服务会删除的Razor组件列表。

@page "/"
@inject MyService myService


@CurrentFragment

@code{

  private RenderFragment CurrentFragment { get; set; }
  private List<TypeInfo> listOfRazorComponents;
 
  protected override void OnInitialized
  {
     listOfRazorComponents = new List<TypeInfo>(myService.GetRazorComponents());
     CreateFragment(listOfRazorComponents[0]);
  }

  RenderFragment CreateFragment(Type typeToDisplay) => builder =>
  {
     builder.OpenComponent(0, typeToDisplay);
     builder.CloseComponent();
  };
}

现在是我的愚蠢错误...在我将@inherits ExampleBase添加到我的所有Razor-Components之后,组件没有被我的“ MyService”重新检查,因为我在那检查了

x=>x.BaseType is ComponentBase 

这导致一个空的Razor组件列表,当我调用CreateFragment(Type typeToDisplay)时,typeToDisplay为null。

我真的不明白为什么builder.OpenComponent(0, null)不会引发NullReferenceException。那让我感到困惑

我自己这么愚蠢的错误让我非常紧张...希望这可以防止其他人忘记这个:)