无法在 Blazor 组件中调用服务
P粉351138462
P粉351138462 2023-08-31 12:01:02
0
2
536
<p>我有一个类似下面这样的服务:</p> <pre class="brush:php;toolbar:false;">namespace Hydra.Services { public class Employee { public string url { get; set; } public async Task<EmployeeModel> GetEmployee(){ // 返回JSON数据 } } }</pre> <p>我想在我的<code>Commpany</code>组件中调用这个服务:</p> <pre class="brush:php;toolbar:false;">@page "/" <div> @company ... </div> <!-- OK,公司详情已经渲染 --> <div> @Employee ... </div> <!-- System.NullReferenceException: '对象引用未设置为对象的实例。' --> @code { company string; emlpoyee string; protected override async Task OnInitializedAsync() using (HttpClient client = new HttpClient()) { // 获取公司详情 // 这里是问题所在: EmployeeModel emp = new Employee(); emp.url = "http://google.com"; emlpoyee = await emp.Employee(); } } }</pre> <p>所以,显示公司的逻辑没有任何问题,但是我在using()内部调用的Employee服务似乎不起作用。除了错误之外,我不知道还有什么问题。</p> <p>这不是忘记包含模型或注入服务的问题。</p> <p>我只是一个初学者,所以问题比较简单。</p>
P粉351138462
P粉351138462

全部回复(2)
P粉496886646

您创建了变量:

@emlpoyee

但您正在调用 @Employee,这将是 null。

尝试切换到您实际放入员工的变量:

@emlpoyee

另外,我认为您拼写了变量错误。也许您的意思是 @employee。

您在这里填充了所有内容:

emlpoyee = await emp.Employee();

因此,从您提供的代码来看,调用 @emlpoyee 是有意义的。

所以将 <div> @Employee ... </div> 改为 <div> @emlpoyee ... </div>

P粉513316221

您的代码没有正确执行服务注入。我向您介绍一种我使用的方法,它可以正确工作,希望对您有用。

首先,您需要为您的服务创建一个接口:

namespace Hydra.Services
{
    public interface IEmployee
    {
        Task<EmployeeModel> GetEmployee();
    }
}

然后,您需要修改您的服务,继承自上述接口,如下所示:

namespace Hydra.Services
{
    public class Employee:IEmployee
    {
        public async Task<EmployeeModel> GetEmployee()
        {
            // 返回JSON数据
        }
    }
}

现在,您应该在Startup.csProgram.cs中注入服务,如下所示:

services.AddScoped<IEmployee,Employee>();

最后,您应该在所需的组件中注入您的服务,如下所示,并轻松使用它:

@page "/"
@using Hydra.Services
@inherits OwningComponentBase<IEmployee>

<div> @company ... </div> <!-- OK,公司详细信息已呈现 --> 
<div> @Employee ... </div>  <!-- System.NullReferenceException: '对象引用未设置为对象的实例。' -->

@code {

    private string company; 
    private EmployeeModel emlpoyee = new EmployeeModel; 

    private IEmployee employeeService => Service;

    protected override async Task OnInitializedAsync()
    
    // 获取公司详细信息


    // 这里是问题所在:
        EmployeeModel emp = new EmployeeModel();
        emp.url = "http://google.com";
        emlpoyee = await employeeService.GetEmployee(); 
    
}

当然,您的代码有很多结构问题,您可能只是想以示例代码的形式指定问题,因此我试图解释使用您自己的代码的工作方法,以便示例对您更具体。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板