#c# #asp.net-core #asp.net-web-api #blazor
#c# #asp.net-core #asp.net-веб-api #blazor
Вопрос:
привет, сообщество, я пытаюсь использовать компонент select2 в blazor, я взял пример с github, но, по правде говоря, я запутался в том, как заполнить компонент записями из базы данных
это страница razor, а это компонент:
<span>Simple string example</span>
<Select2 TItem="string"
Id="simple-string-example"
Data="@SimpleStringList"
@bind-Value="@ValueSelected">
</Select2>
<span>Currently selected value: @ValueSelected</span>
<br />
@code {
private EditContext EditContext { get; set; }
private Select2<SomeInnerObject> ProvidedSelect2Ref { get; set; }
public SomeObject FakeObject { get; set; } = new SomeObject { SomeName = "Name" };
private List<string> SimpleStringList { get; set; } = new List<string>();
private List<SomeInnerObject> InnerObjectList { get; set; }
private string ValueSelected { get; set; }
private SomeInnerObject FooObject = new SomeInnerObject { InnerName = "Inner Foo" };
protected override void OnAfterRender(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
SimpleStringList.Add("Foo");
SimpleStringList.Add("Bar");
SimpleStringList.Add("Baz");
InnerObjectList = new List<SomeInnerObject> { FooObject, new SomeInnerObject { InnerName = "Inner bar" } };
for (var i = 0; i < 100; i )
InnerObjectList.Add(new SomeInnerObject { InnerName = $"Inner bar{i}" });
EditContext = new EditContext(FakeObject).AddDataAnnotationsValidation();
StateHasChanged();
}
}
}
Как вы могли бы заполнить компонент записями из базы данных, вызывая API в контроллере, что-то вроде этого:
private async Task<IEnumerable<Persona>> BuscarPersonas(string searchText)
{
var responseHttp = await repositorio.Get<List<Persona>>($"api/Personas/buscar/{searchText}");
return responseHttp.Response;
}
}
Ответ №1:
Проверка результата
Вот пример Blazor (клиент) и WebAPI (сервер).
На стороне клиента (Blazor)
1. Привязать List<Persona>
к Select2
и извлекать данные из PersonaService
.
Коды Index.razor
@page "/"
@using System.Linq
@using Demo.WebAssembly.Models
@using Demo.WebAssembly.Data
@inject PersonaService service
<span>Simple string example</span>
<Select2 TItem="Persona"
Id="simple-string-example"
Data="@personas"
TextExpression="@(item => item.Name)"
@bind-Value="@ValueSelected">
</Select2>
<span>Currently selected Inner value: @(ValueSelected?.Name)</span>
<br />
@code
{
private Persona ValueSelected { get; set; } = new Persona { Name = "Name" };
private List<Persona> personas { get; set; }
protected override async Task OnInitializedAsync()
{
var personaList = await service.BuscarPersonas("user");
personas = personaList.ToList();
}
protected override void OnAfterRender(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
StateHasChanged();
}
}
}
2. Запросить данные из URL(«https://localhost:44307/api/Personas/buscar /{searchText}»)
Коды PersonaService
public class PersonaService
{
public async Task<IEnumerable<Persona>> BuscarPersonas(string searchText)
{
HttpClient httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://localhost:44307/api/Personas/buscar/" searchText);
if (response.IsSuccessStatusCode)
{
var result = await JsonSerializer.DeserializeAsync<Persona[]>(await response.Content.ReadAsStreamAsync(), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
return resu<
}
else
{
return null; //handle the response that was not successful here.
}
}
}
Серверная часть (WebAPI)
1. получите и обработайте запрос. возвращает данные в json
формате.
Коды Controller
[HttpGet]
[Route("/api/Personas/buscar/{searchText}")]
public async Task<JsonResult> GetPersona(string searchText)
{
var personas = _repository.getPersona(searchText);
return new JsonResult(personas);
}
2. Извлеките данные из базы данных.
Коды Repository
public List<Persona> getPersona(string searchText)
{
var personas = _context.Personas.Where(p=>p.Name.Contains(searchText)).ToList();
return personas;
}
Примечания: Если доступ к данным из другого домена (https://localhost:44379 ) как и в примере выше, не забудьте включить CORS.
Ссылки: Создайте веб-API с ASP.NET Ядро
Комментарии:
1. Большое вам спасибо за ваше время и помощь, у меня это отлично сработало, хотя я не очень хорошо разбирался в использовании PersonaService
2. @JasielTorres Вы реализовали его точно так же, как принятый ответ? У меня почему-то это не работает. Мне удалось заполнить объект данных (personas), но не обновляет параметры компонента select2