मैं अपने रेजर-घटकों के लिए बेस-क्लास बनाने जा रहा हूं। यह बेस-क्लास इस तरह दिखता है:

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

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

मेरा ब्लेज़र-घटक इस वर्ग से विरासत में मिला है

@inherits ExampleBase

<button @onclick="Submit" />

अब तक बहुत अच्छा है, लेकिन जब मैं अपना ऐप शुरू करता हूं और यह पेज लोड होने वाला है तो मुझे एक अपवाद प्राप्त होता है:

[२०२०-०९-२९टी१२:०९:०३.९२०जेड] त्रुटि: System.ArgumentException: घटक प्रकार को Microsoft.AspNetCore.Components.IComponent को लागू करना चाहिए। Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent (Int32 अनुक्रम, प्रकार घटक प्रकार) पर

ComponentBase से विरासत में मिलने पर क्या गलत है?

आपकी सहायता के लिए धन्यवाद

जोड़: मैं अपने रेजर-कंपोनेंट को इस तरह से कॉल करता हूं और बिल्डर पर अपवाद फेंकता है।OpenComponentem

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

उम्मीद है ये मदद करेगा

4
JoeGER94 29 सितंबर 2020, 15:22

1 उत्तर

सबसे बढ़िया उत्तर

सबसे पहले - मदद के लिए आप सभी का धन्यवाद मैं वास्तव में सराहना करता हूं!

कुछ घंटों के ब्रेक के बाद। मुझे अपनी गलती मिल गई...

मैं क्या कर रहा हूं: मैंने एक ऐसी सेवा बनाई है जो टाइप सूची की सूची लोड करती है, यह सेवा रेजर-घटक में इंजेक्ट हो जाती है।

सेवा का कोड:

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

मेरे रेजर-कंपोनेंट में मैंने रेजर-कंपोनेंट की सूची प्रदर्शित की है जो सेवा द्वारा लौटाया जाता है।

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

अब मेरी बेवकूफी भरी गलती ... जब मैंने अपने सभी रेजर-कंपोनेंट्स में @inherits exampleBase को जोड़ा, तो कंपोनेंट्स को मेरी "MyService" द्वारा फिर से नहीं जोड़ा गया क्योंकि मैंने वहां चेक किया था

x=>x.BaseType is ComponentBase 

इसने रेजर-घटकों की एक खाली सूची का कारण बना और जब मैंने CreateFragment(Type typeToDisplay) को कॉल किया तो typeToDisplay शून्य था।

मैं वास्तव में समझ नहीं पा रहा हूं कि builder.OpenComponent(0, null) एक NullReferenceException क्यों नहीं फेंकता। यह मेरे लिए भ्रमित करने वाला है

मेरे द्वारा इस तरह की मूर्खतापूर्ण त्रुटि ने मुझे बहुत परेशान किया ... आशा है कि यह दूसरों को इसे भूलने से रोकेगा :)

1
JoeGER94 30 सितंबर 2020, 00:32