Blazor-Component erbt von BaseClass

Sep 29 2020

Ich bin dabei, eine Basisklasse für meine Rasiererkomponenten zu erstellen. Diese Basisklasse sieht aus wie:

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

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

Meine Blazor-Komponente erbt von dieser Klasse

@inherits ExampleBase

<button @onclick="Submit" />

So weit so gut, aber wenn ich meine App starte und diese Seite gerade geladen wird, erhalte ich eine Ausnahme:

[2020-09-29T12: 09: 03.920Z] Fehler: System.ArgumentException: Der Komponententyp muss Microsoft.AspNetCore.Components.IComponent implementieren. bei Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (Int32-Sequenz, Typ componentType)

Was ist falsch daran, von ComponentBase geerbt zu werden?

Danke für Ihre Hilfe

Ergänzung: Ich rufe meine Razor-Komponente so auf und die Ausnahme löst builder.OpenComponent aus

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

Hoffe das hilft

Antworten

JoeGER94 Sep 30 2020 at 04:32

Zuallererst - Vielen Dank für Ihre Hilfe, die ich sehr schätze!

Nach ein paar Stunden Pause. Ich habe meinen eigenen Fehler gefunden ...

Was ich tue: Ich habe einen Dienst erstellt, der eine Liste der Typlisten lädt, die dieser Dienst in eine Razor-Komponente einfügt.

Der Code of Service:

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

In meiner Rasiererkomponente habe ich die Liste der Rasiererkomponenten angezeigt, die vom Dienst zurückgegeben wird.

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

Nun mein dummer Fehler ... Nachdem ich die @inherits ExampleBase zu allen meinen Razor-Komponenten hinzugefügt hatte, wurden die Komponenten von meinem "MyService" nicht neu erstellt, weil ich dort nachgesehen habe

x=>x.BaseType is ComponentBase 

Dies verursachte eine leere Liste von Razor-Komponenten und als ich CreateFragment(Type typeToDisplay)den typeToDisplay aufrief, war er null.

Ich verstehe wirklich nicht, warum builder.OpenComponent(0, null)keine NullReferenceException ausgelöst wird. Das ist verwirrend für mich

Solch ein dummer Fehler selbst hat mich sehr nervös gemacht ... hoffe, das verhindert, dass andere das vergessen :)