Blazor-Component hereda de BaseClass
Estoy a punto de crear una clase base para mis componentes Razor. Esta Clase Base se parece a:
public abstract class ExampleBase : ComponentBase
{
public virtual void Submit()
{
//DoSomething
}
public virtual void Back()
{
//DoSomething else
}
}
mi Blazor-Component hereda de esta clase
@inherits ExampleBase
<button @onclick="Submit" />
Hasta ahora todo bien, pero cuando inicio mi aplicación y esta página está a punto de cargarse, recibo una excepción:
[2020-09-29T12: 09: 03.920Z] Error: System.ArgumentException: el tipo de componente debe implementar Microsoft.AspNetCore.Components.IComponent. en Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (secuencia Int32, Type componentType)
¿Qué hay de malo en ser heredado de ComponentBase?
Gracias por tu ayuda
Además: llamo a mi Razor-Component así y la Excepción se lanza al constructor.
RenderFragment CreateFragment() => builder =>
{
builder.OpenComponent(0, typeof(MyRazorComponent));
builder.CloseComponent();
}
Espero que esto ayude
Respuestas
En primer lugar, gracias a todos por su ayuda, ¡lo agradezco mucho!
Después de unas horas de descanso. Encontré mi propio error ...
Lo que estoy haciendo: he creado un servicio que carga una Lista de lista de tipos que este servicio se inyecta en un componente Razor.
El código de servicio:
//this returns a listOfRazorComponents
return AppDomain.CurrentDomain.GetAssemblies()
.Where(x => x.FullName.StartsWith("SampleApplication")).FirstOrDefault()
.DefinedTypes.Where(x=>x.BaseType is ComponentBase);
En mi Razor-Component, he mostrado la lista de Razor-Component que es devuelto por el servicio.
@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();
};
}
Ahora mi estúpido error ... Después de que agregué @inherits ExampleBase a todos mis Razor-Components, los componentes no fueron reconocidos por mi "MyService" porque busqué allí
x=>x.BaseType is ComponentBase
esto provocó una lista vacía de componentes de Razor y cuando llamé a CreateFragment(Type typeToDisplay)typeToDisplay era nulo.
Realmente no entiendo por qué builder.OpenComponent(0, null)no lanza una NullReferenceException. Eso es confuso para mi
un error tan estúpido por mi parte me tomó muchos nervios ... espero que esto evite que otros olviden esto :)