我在 Chat GPT 上来回了 10 多次,陷入了 CS7036 错误的无限循环中。我有一个 Blazor 项目,在其中创建了一个自定义抽象页面类
MyPage
子类 ComponentBase,然后我为所有 razor 页面创建子类。这样我就可以在我的所有页面上放置通用代码。
我想将 NavigationManager 注入到这个
MyPage
类中,以便我的所有页面都可以访问从中收集的一些数据(即现在的当前路线)。
所以,这就是我尝试过的:两种方法,但都不起作用。
在
MyPage
课程上,我尝试像这样注入navmanager:
public class MyPage : ComponentBase
{
protected NavigationManager NavigationManager { get; set; }
protected MyPage(NavigationManager navManager)
{
NavigationManager = navManager;
}
}
然后,在我的剃须刀页面中:
@page "/example"
@inherits MyPage
@code {
[Inject]
protected NavigationManager NavigationManager { get; set; }
}
此方法包括创建一个服务,将其添加到 Program.cs 中的应用程序中,但页面仍然给出错误消息。
这是聊天 GPT 所说的:
创建一个提供NavigationManager的服务:创建一个提供对NavigationManager的访问的单例服务。
public class NavigationManagerService
{
public NavigationManager NavigationManager { get; }
public NavigationManagerService(NavigationManager navigationManager)
{
NavigationManager = navigationManager;
}
}
在应用程序的 Startup.cs 或等效文件中将服务注册为单例:
services.AddSingleton<NavigationManagerService>();
将NavigationManagerService注入抽象类:修改抽象类以接受NavigationManagerService,而不是直接注入NavigationManager。
public abstract class MyPageClass : ComponentBase
{
protected NavigationManager NavigationManager => NavigationService.NavigationManager;
protected NavigationManagerService NavigationService { get; }
protected MyPageClass(NavigationManagerService navigationService)
{
NavigationService = navigationService;
}
}
从 Razor 组件中的抽象类继承并注入 NavigationManagerService:
@page "/example"
@inherits MyPageClass
@code {
protected override void OnInitialized()
{
base.OnInitialized();
}
}
通过此设置,NavigationManagerService 将处理提供 NavigationManager。该抽象类将接受NavigationManagerService,并且您的Razor组件将从该抽象类继承,从而通过NavigationManagerService间接访问NavigationManager。这应该可以解决 CS7036 错误。
有人有办法实现这个吗?
在
MyPage
中使用属性注入:
public abstract partial class MyPage {
[Inject]
protected NavigationManager NavigationManager { get; set; } = default!;
}
只需在您的页面中继承
MyPage
@page "/example"
@inherits MyPage
Current Uri: @NavigationManager.Uri