Как использовать компонент select2 в blazor?

#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