Значение HttpContextAccesor равно нулю после вызова в службе различий, где оно было введено при использовании пользовательского компонента в blazor

#asp.net-core #blazor #blazor-server-side #asp.net-blazor

Вопрос:

Я изучил распределение атрибутов для компонента blazor,класс которого я не определил как наследующий базу компонентов, но я настроил некоторое поле свойств для присвоения атрибутов html, а затем всякий раз, когда вводится HttpContextAccesor(он повторяется 3-4 раза, чтобы быть введенным в конструктор первых служб и только дважды во второй службе, а затем вызывается метод для использования API из первой службы, затем, когда он завершается, и вторая служба вызывается, средство доступа к контексту равно нулю

здесь определен пользовательский компонент (дочерний компонент )

 lt;input required="@InputParameters["required"]" max="@InputParameters["max"]" maxlength="@InputParameters["maxlength"]"   placeholder="@InputParameters["placeholder"]" size="@InputParameters["min"]"  value="@InputParameters["value"]" min="@InputParameters["min"]" name="@NameInput" /gt;  @code {   [Parameter]  public Dictionarylt;string, objectgt; InputParameters { get; set; } = new Dictionarylt;string, objectgt;  {  {"required","required" },  {"placeholder","text place holder" },  {"size", 100 },  {"maxlength",100 },  {"max",100 },  {"min",0 },  {"value",null }  };   [Parameter]  public string NameInput { get; set; }  }  

вот родительский компонент

 @page "/EditEmployee/{Id:int}" @inherits EditEmployeeBase @using SharedRazorClassLibrary.Components; @using EmployeeManagement.Models;  lt;h3gt;EditEmployeelt;/h3gt;  lt;labelgt;Time Elapsed: @ElapsedTime lt;/labelgt; lt;EditForm Model="Employee" OnValidSubmit="SaveEmployeeDetails" OnInvalidSubmit="CheckErrors"gt;  lt;DataAnnotationsValidator /gt;  lt;MultiParameterComponent InputParameters="@(new Dictionarylt;string, objectgt; {  {"size",120 },  {"placeholder","Hello"},  {"maxlength",500 },  {"max",500 },  {"min",1 },  {"value",null }  })" NameInput="CustomMultiInput"gt;lt;/MultiParameterComponentgt;  lt;div class="form-group" rowgt;  lt;label for="@Employee.FirstName" class="col-sm-2 col-form-label"gt; lt;/labelgt;  lt;div class="col-sm-10"gt;  lt;InputText @bind-Value="Employee.FirstName"gt;lt;/InputTextgt;  lt;ValidationMessage For="@(() =gt; Employee.FirstName)" /gt;  lt;/divgt;  lt;/divgt;  lt;div class="form-group" rowgt;  lt;label for="@Employee.LastName" class="col-sm-2 col-form-label"gt;lt;/labelgt;  lt;div class="col-sm-10"gt;  lt;InputText @bind-Value="Employee.LastName"gt;lt;/InputTextgt;  lt;ValidationMessage For="@(() =gt; Employee.LastName)" /gt;  lt;/divgt;  lt;/divgt;   lt;div class="form-group" rowgt;  lt;label for="@Employee.DepartmentId" class="col-sm-2 col-form-label"gt;lt;/labelgt;  lt;div class="col-sm-10"gt;  lt;CustomInputSelect @bind-Value="Employee.DepartmentId"gt;  @foreach (var dept in Departments)  {  lt;option value="@dept.DepartmentId"gt;@dept.DepartmentNamelt;/optiongt;  }  lt;/CustomInputSelectgt;  lt;ValidationMessage For="@(() =gt;Employee.DepartmentId)" /gt;  lt;/divgt;  lt;/divgt;  lt;div class="form-group"gt;  lt;label for="@Employee.Gender"gt; Gender lt;/labelgt;  lt;div class="col-sm-10"gt;  lt;CustomInputSelect @bind-Value="Employee.Gender"gt;  @foreach (var gender in Enum.GetValues(typeof(Gender)))  {  lt;option value="@gender"gt;@genderlt;/optiongt;  }   lt;/CustomInputSelectgt;   lt;/divgt;  lt;/divgt;  lt;div class="form-group" rowgt;  lt;label for="@Employee.DateOfBirth" class="col-sm-2 col-form-label"gt;lt;/labelgt;  lt;div class="col-sm-10"gt;  lt;InputDate @bind-Value="Employee.DateOfBirth" @bind-Value:format="dd/MM/YYYY"gt;lt;/InputDategt;  lt;/divgt;  lt;/divgt;  lt;div class="form-group"gt;  lt;label for="@Employee.Email"gt;Emaillt;/labelgt;  lt;InputText @bind-Value="@Employee.Email"gt;lt;/InputTextgt;  lt;ValidationMessage For="@(()=gt;Employee.Email)" /gt;  lt;/divgt;  lt;button type="submit"gt;Submitlt;/buttongt;  lt;a href="/DeleteEmployee/@Employee.EmployeeId" @onclick="DeleteEmployee" class="btn btn-danger"gt;Deletelt;/agt;  lt;/EditFormgt;    

вот инъекция сервиса стартапа

 services.AddRazorPages();  services.AddServerSideBlazor();  services.AddAutoMapper((config) =gt; {  config.AddProfile(typeof(EmployeeProfile));  });  services.AddHttpContextAccessor();  services.AddSingletonlt;PathHelpergt;();  //services.AddScopedlt;Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessorgt;();  services.AddScopedlt;IEmployeeServices,EmployeeServicesgt;();  services.AddScopedlt;IDepartmentServices, DepartmentServicesgt;();  services.AddHttpClientlt;IEmployeeServices,EmployeeServicesgt;().ConfigureHttpClient((sp, httpClient) =gt; {     });  

поэтому мне интересно, что может быть причиной того, что второй запрос делает интерфейс IHTTPContextAccesor нулевым?

Комментарии:

1. [Вежливо ]Я вижу форму, с MultiParameterComponent которой, похоже, это не сработает и ни к чему не привязано. Затем какой-то искаженный вопрос о HttpContextAccessor. В данный момент я не вижу никакой связи. Для чего вы используете HttpContextAccessor. Как это связано с формой? Я пишу много кода Blazor, и я очень редко использовал HttpContextAccessor его .

2. Я думаю, у вас проблема с XY. Не могли бы вы поделиться, пожалуйста, почему вы хотите использовать HttpContextAccessor?

3. @MayurEkbote мне нужно знать, запускаю ли я проект с кодом VS или VS, поэтому доступ к контексту позволяет мне узнать, какие порты он использует, хотя он отлично работает, если я удалю пользовательский компонент ввода

4. @MrCakaShaunCurtis я не знаю, но это происходит только тогда, когда я добавляю этот компонент в форму редактирования,

5. Так что проблема в MultiParameterComponent том, чтобы . Чего вы пытаетесь достичь с его помощью, чего не может сделать один из элементов управления вводом Blazor с небольшим форматированием? Я не пытаюсь быть педантичным, просто поймите, чего вы пытаетесь достичь. 🙂

Ответ №1:

Странным решением было введение интерфейса в том же порядке, в каком я его вводил

сначала HttpClient, а затем IHpttpContextAccessor таким образом, DI, казалось, работал должным образом, хотя я использую HttpAccessor как временный, потому что в области действия он создает исключение при регистрации службы при запуске