【问题标题】:Can I call NavigationManager in a Blazor service我可以在 Blazor 服务中调用 NavigationManager
【发布时间】:2020-07-19 18:41:42
【问题描述】:

我正在尝试创建一个错误页面服务,该服务在被调用时将确定发生了哪种类型的异常并正确处理代码。如果异常是“重定向”类型,它应该将用户发送到登录页面(出于测试目的,我只是使用主页“/”页面)。

我正在尝试使用 NavigationMangager.NavigateTo("/") 但每当我到达该函数调用时就会遇到 Null 点异常。我一直在寻找解决方案一段时间,但我看到的一切都是 NavigationManager 在 .razor 文件中的使用,我正在尝试在 .cs 服务中完成此操作。这目前是不可能的,还是我只是做错了什么?我在下面的文件“ErrorProcessingService.cs”中包含了所有相关代码,我们将不胜感激。

using ToDoList.Pages;
using Microsoft.AspNetCore.Components;

namespace ToDoList.ExceptionHandler
{
    public class ErrorProcessingService
    {

        [Inject]
        protected NavigationManager NavigationManager {get; set;}

        public void processError(ErrorTypes.errorType et)
        {
            new ErrorTypes();
            switch(et)
            {
                case ErrorTypes.errorType.ignore:
                    //To Be Implemented
                    break;
                case ErrorTypes.errorType.popup:
                    //To Be Implemented
                    break;
                case ErrorTypes.errorType.redirect:
                    NavigationManager.NavigateTo("/");
                    break;
            }
        }
    }
}

【问题讨论】:

    标签: web razor dependency-injection webserver blazor


    【解决方案1】:

    在服务中你不能使用[Inject] 属性,而是在构造函数中注入依赖:

    using ToDoList.Pages;
    using Microsoft.AspNetCore.Components;
    
    namespace ToDoList.ExceptionHandler
    {
        public class ErrorProcessingService
        {
            public ErrorProcessingService(NavigationManager navigationManager)
            {
                 NavigationManager = navigationManager;
            }
    
            protected NavigationManager NavigationManager { get; }
    
            public void processError(ErrorTypes.errorType et)
            {
                new ErrorTypes();
                switch(et)
                {
                    case ErrorTypes.errorType.ignore:
                        //To Be Implemented
                        break;
                    case ErrorTypes.errorType.popup:
                        //To Be Implemented
                        break;
                    case ErrorTypes.errorType.redirect:
                        NavigationManager.NavigateTo("/");
                        break;
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢,成功了!我还需要将服务从单例更改为范围,在进行更改后,它起作用了
    • 可以添加创建这个服务的代码吗?在构建此服务时,我不知道如何获取 NavigationManager 的引用。
    • @Adam 它通过依赖注入工作。您只需在 DI 中添加服务:services.AddTransient<ErrorProcessingService>() 例如。
    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 2020-11-21
    • 2021-10-08
    • 2020-07-04
    • 1970-01-01
    • 2013-12-11
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多