如何将 Blazor NavigationManager 注入到我为 razor 页面创建子类的抽象类中

问题描述 投票:0回答:1

我在 Chat GPT 上来回了 10 多次,陷入了 CS7036 错误的无限循环中。我有一个 Blazor 项目,在其中创建了一个自定义抽象页面类

MyPage
子类 ComponentBase,然后我为所有 razor 页面创建子类。这样我就可以在我的所有页面上放置通用代码。

我想将 NavigationManager 注入到这个

MyPage
类中,以便我的所有页面都可以访问从中收集的一些数据(即现在的当前路线)。

所以,这就是我尝试过的:两种方法,但都不起作用。

方法 1

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; }
}

方法 2

此方法包括创建一个服务,将其添加到 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 错误。


当然,这两种方法都不能消除错误,并且不会让我构建。

有人有办法实现这个吗?

razor dependency-injection blazor
1个回答
0
投票

MyPage
中使用属性注入:

public abstract partial class MyPage {
    [Inject]
    protected NavigationManager NavigationManager { get; set; } = default!;
}

只需在您的页面中继承

MyPage

@page "/example"
@inherits MyPage

Current Uri: @NavigationManager.Uri
© www.soinside.com 2019 - 2024. All rights reserved.