首頁  >  問答  >  主體

無法在 Blazor 元件中呼叫服務

<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粉351138462P粉351138462415 天前455

全部回覆(2)我來回復

  • P粉496886646

    P粉4968866462023-09-01 10:39:42

    您建立了變數:

    @emlpoyee

    但您正在呼叫 @Employee,這將是 null。

    嘗試切換到您實際放入員工的變數:

    @emlpoyee

    另外,我認為您拼寫了變數錯誤。也許您的意思是 @employee。

    您在這裡填充了所有內容:

    emlpoyee = await emp.Employee();

    因此,從您提供的程式碼來看,呼叫 @emlpoyee 是有意義的。

    所以將 <div> @Employee ... </div> 改為 <div> @emlpoyee ... </div>

    #

    回覆
    0
  • P粉513316221

    P粉5133162212023-09-01 09:57:36

    您的程式碼沒有正確執行服務注入。我向您介紹一種我使用的方法,它可以正確工作,希望對您有用。

    首先,您需要為您的服務建立一個介面:

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

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

    回覆
    0
  • 取消回覆