無法在 Blazor 元件中呼叫服務
P粉351138462
P粉351138462 2023-08-31 12:01:02
0
2
530
<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(); 
    
}

當然,您的程式碼有很多結構問題,您可能只是想以範例程式碼的形式指定問題,因此我試圖解釋使用您自己的程式碼的工作方法,以便示例對您更具體。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板