Blazor-Component eredita da BaseClass

Sep 29 2020

sto per creare una classe base per i miei componenti Razor. Questa classe base ha questo aspetto:

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

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

my Blazor-Component eredita da questa classe

@inherits ExampleBase

<button @onclick="Submit" />

Fin qui tutto bene, ma quando avvio la mia app e questa pagina sta per caricarsi, ricevo un'eccezione:

[2020-09-29T12: 09: 03.920Z] Errore: System.ArgumentException: il tipo di componente deve implementare Microsoft.AspNetCore.Components.IComponent. in Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (sequenza Int32, tipo componentType)

cosa c'è di sbagliato nell'essere ereditato da ComponentBase?

Grazie per l'aiuto

Aggiunta: chiamo il mio Razor-Component in questo modo e l'eccezione lancia al builder.

RenderFragment CreateFragment() => builder =>
{
  builder.OpenComponent(0, typeof(MyRazorComponent));
  builder.CloseComponent();
}

Spero che sia di aiuto

Risposte

JoeGER94 Sep 30 2020 at 04:32

Prima di tutto, grazie a tutti per il vostro aiuto, lo apprezzo davvero!

Dopo qualche ora di pausa. Ho trovato il mio errore ...

Cosa sto facendo: ho creato un servizio che carica un elenco di elenchi di tipi che questo servizio viene iniettato in un componente Razor.

Il codice di servizio:

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

Nel mio Razor-Component ho visualizzato l'elenco dei Razor-Component che viene restituito dal servizio.

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

Ora il mio stupido errore ... Dopo aver aggiunto @inherits ExampleBase a tutti i miei componenti Razor, i componenti non sono stati ricontrollati dal mio "MyService" perché ho controllato lì per

x=>x.BaseType is ComponentBase 

questo ha causato un elenco vuoto di componenti Razor e quando ho chiamato CreateFragment(Type typeToDisplay)il typeToDisplay era nullo.

Non capisco davvero perché builder.OpenComponent(0, null)non genera un'eccezione NullReferenceException. Questo è fonte di confusione per me

un errore così stupido da parte mia mi ha preso molto sui nervi ... spero che questo impedisca ad altri di dimenticarlo :)