我即将为我的Razor组件创建一个基类。这个基类看起来像:
public abstract class ExampleBase : ComponentBase
{
public virtual void Submit()
{
//DoSomething
}
public virtual void Back()
{
//DoSomething else
}
}
我的Blazor组件继承自此类
@inherits ExampleBase
<button @onclick="Submit" />
到目前为止还不错,但当我启动我的应用程序,这个页面即将加载时,我收到一个异常:
〔2020-09-29T12:09:03.920Z〕错误:System.ArgumentException:组件类型必须实现Microsoft.AspNetCore.Components.IComponent。在Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.OpenComponent(Int32序列,类型componentType(
从ComponentBase继承有什么问题?
感谢您的帮助
添加:我像这样调用我的Razor组件,并且异常向生成器抛出。OpenComponent
RenderFragment CreateFragment() => builder =>
{
builder.OpenComponent(0, typeof(MyRazorComponent));
builder.CloseComponent();
}
希望这能帮助
首先,感谢大家的帮助,我真的很感激!
休息了几个小时之后我发现了自己的错误
我正在做的是:我创建了一个服务,它加载了一个类型列表,这个服务被注入到Razor组件中。
服务代码:
//this returns a listOfRazorComponents
return AppDomain.CurrentDomain.GetAssemblies()
.Where(x => x.FullName.StartsWith("SampleApplication")).FirstOrDefault()
.DefinedTypes.Where(x=>x.BaseType is ComponentBase);
在我的Razor组件中,我显示了服务返回的RazorComponent列表。
@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添加到我的所有Razor组件后,组件没有被我的";MyService";因为我在那里查了
x=>x.BaseType is ComponentBase
这导致Razor组件列表为空,当我调用CreateFragment(Type typeToDisplay)
时,typeToDisplay为null。
我真的不明白builder.OpenComponent(0, null)
为什么不抛出NullReferenceException。让我很困惑
我自己犯了这样一个愚蠢的错误,让我很紧张。。。希望这能防止其他人忘记这一点:(
对我来说,这只是csproj设置中的一个简单错误。我的剃刀组件没有将构建操作设置为"内容",而是设置为"无"。您可以看到,当您选择项目中的文件和人民币->属性。
不确定为什么会发生这种情况,因为我用"Add->剃刀组件…'但我正在与其他可能有同样问题的人分享这一点。
此外,它编译得很好,所以它让我措手不及