Blazor-Component erbt von BaseClass
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
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 :)