Blazor-Component наследуется от BaseClass

Sep 29 2020

я собираюсь создать базовый класс для моих компонентов Razor. Этот базовый класс выглядит так:

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();
}

Надеюсь это поможет

Ответы

JoeGER94 Sep 30 2020 at 04:32

Прежде всего - спасибо всем за вашу помощь, я очень признателен!

После нескольких часов перерыва. Я нашел свою ошибку ...

Что я делаю: я создал службу, которая загружает список типов, которые эта служба вводит в Razor-Component.

Код услуги:

//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, компоненты не были повторно настроены моим "MyService", потому что я проверил там наличие

x=>x.BaseType is ComponentBase 

это вызвало пустой список компонентов Razor, и когда я вызвал CreateFragment(Type typeToDisplay)typeToDisplay, был нулевым.

Я действительно не понимаю, почему builder.OpenComponent(0, null)не генерирует исключение NullReferenceException. Это сбивает меня с толку

такая глупая ошибка меня забрала у меня много нервов ... надеюсь, это помешает другим забыть об этом :)