#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 как временный, потому что в области действия он создает исключение при регистрации службы при запуске