Maison  >  Questions et réponses  >  le corps du texte

Impossible d'appeler le service dans le composant Blazor

<p>J'ai un service qui ressemble à ceci : </p> <pre class="brush:php;toolbar:false;">espace de noms Hydra.Services { Employé de classe publique { URL de chaîne publique { get ; set } Tâche asynchrone publique<EmployeeModel> GetEmployee(){ // Renvoie les données JSON } } }</pré> <p>Je souhaite appeler ce service dans mon composant <code>Company</code> <pre class="brush:php;toolbar:false;">@page "/" <div> @company ... </div> <!-- OK, les détails de l'entreprise ont été rendus --> <div> @Employee ... </div> <!-- System.NullReferenceException : 'La référence d'objet n'est pas définie sur une instance d'un objet. ' ---> @code { chaîne d'entreprise ; chaîne emlpoyee ; Tâche asynchrone de remplacement protégé OnInitializedAsync() en utilisant (client HttpClient = new HttpClient()) { // Obtenir les détails de l'entreprise // Voici le problème : EmployeeModel emp = new Employee(); emp.url = "http://google.com"; emlpoyee = attendre emp.Employee(); } } }</pré> <p>Donc, il n'y a rien de mal avec la logique d'affichage de l'entreprise, mais le service Employee que j'appelle à l'intérieur using() ne semble pas fonctionner. Je ne sais pas ce qui ne va pas à part l'erreur. </p> <p>Il ne s’agit pas d’oublier d’inclure un modèle ou d’injecter un service. </p> <p>Je ne suis qu'un débutant, les questions sont donc relativement simples. </p>
P粉351138462P粉351138462415 Il y a quelques jours457

répondre à tous(2)je répondrai

  • P粉496886646

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

    Vous avez créé la variable :

    @emlpoyee

    Mais vous appelez @Employee, ce qui sera nul.

    Essayez de passer à la variable que vous avez réellement saisie dans l'employé :

    @emlpoyee

    De plus, je pense que vous avez mal orthographié la variable. Peut-être que vous voulez dire @employé.

    Vous avez tout rempli ici :

    emlpoyee = await emp.Employee();

    Donc, d'après le code que vous avez fourni, appeler @emlpoyee est logique.

    Et aussi <div> @Employee ... </div> 改为 <div> @emlpoyee ... </div>

    répondre
    0
  • P粉513316221

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

    Votre code n'effectue pas correctement l'injection de service. Je vous présente une méthode que j'utilise et qui fonctionne correctement, j'espère qu'elle vous sera utile.

    Tout d'abord, vous devez créer une interface pour votre service :

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

    Vous devez ensuite modifier votre service, en héritant de l'interface ci-dessus, comme suit :

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

    Maintenant, vous devriez injecter le service dans Startup.csProgram.cs comme ceci :

    services.AddScoped<IEmployee,Employee>();

    Enfin, vous devez injecter votre service dans le composant requis comme indiqué ci-dessous et l'utiliser facilement :

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

    Bien sûr, votre code présente de nombreux problèmes structurels, et vous souhaiterez peut-être simplement spécifier le problème sous forme d'exemple de code. J'ai donc essayé d'expliquer comment cela fonctionne en utilisant votre propre code afin que l'exemple vous soit plus spécifique. .

    répondre
    0
  • Annulerrépondre