Blazor-Component mewarisi dari BaseClass

Sep 29 2020

saya akan membuat Base-Class untuk Razor-Components saya. Kelas Dasar ini terlihat seperti:

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

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

Komponen Blazor saya mewarisi dari kelas ini

@inherits ExampleBase

<button @onclick="Submit" />

Sejauh ini bagus, tetapi ketika saya memulai Aplikasi saya dan Halaman ini akan dimuat maka saya menerima Pengecualian:

[2020-09-29T12: 09: 03.920Z] Kesalahan: System.ArgumentException: Jenis komponen harus menerapkan Microsoft.AspNetCore.Components.IComponent. di Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (urutan Int32, Jenis componentType)

apa yang salah jika diwarisi dari ComponentBase?

Terima kasih atas bantuan Anda

Penambahan: Saya menyebut Razor-Component saya seperti ini dan Exception melempar ke builder.OpenComponent

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

Semoga ini membantu

Jawaban

JoeGER94 Sep 30 2020 at 04:32

Pertama-tama - Terima kasih atas bantuan Anda, saya sangat menghargai!

Setelah istirahat beberapa jam. Saya menemukan kesalahan saya sendiri ...

Apa yang saya lakukan: saya telah membuat layanan yang memuat Daftar Jenis Daftar layanan ini mendapat suntikan dalam Komponen-Razor.

Kode layanan:

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

Di Razor-Component saya, saya telah menampilkan Daftar Razor-Component yang digunakan kembali oleh layanan.

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

Sekarang kesalahan bodoh saya ... Setelah saya menambahkan @inherits ExampleBase ke semua Razor-Components saya, Komponen tidak dikenali oleh "MyService" saya karena saya memeriksanya di sana

x=>x.BaseType is ComponentBase 

ini menyebabkan List of Razor-Components kosong dan ketika saya memanggil CreateFragment(Type typeToDisplay)typeToDisplay adalah null.

Saya benar-benar tidak mengerti mengapa builder.OpenComponent(0, null)tidak melempar NullReferenceException. Itu membingungkan saya

kesalahan bodoh seperti itu sendiri membuat saya sangat gugup ... harap ini akan mencegah orang lain melupakan ini :)