Почему отображается ноль вместо значений, выбранных из ввода множественного выбора?

Я работаю на стороне сервера blazor. Я столкнулся с проблемой, я не могу получить значения, выбранные на странице бритвы

Я могу выбрать данные и заполнить элемент управления select 2, но не могу получить выбранные значения, разделенные запятой снаружи на <p> tag.

Я ставлю точку останова на событие OnSelectedValuesChanged оно не перехватывается и не срабатывает при отладке.

Выдать выбранное значение для выбранных элементов, отображающих нуль

пользовательский элемент управления, который я сделал (Select2MultiSelect.razor)

<select id = "@ElementId" @onchange = "OnSelectionChanged">
    @foreach (var option in Options)
    {
        <option value = "@option.serverID">@option.server_Name</option>
    }
</select>

@code {
    [Parameter] public string ElementId { get; set; } = "select2_" + Guid.NewGuid().ToString("N");
    [Parameter] public List<SelectedServers> Options { get; set; } = new();
    [Parameter] public List<string> SelectedValues { get; set; } = new();
    [Parameter] public EventCallback<List<string>> SelectedValuesChanged { get; set; }

    private async Task OnSelectionChanged(ChangeEventArgs args)
    {
        SelectedValues = await JSRuntime.InvokeAsync<List<string>>("select2Interop.getSelectedValues", ElementId);
        await SelectedValuesChanged.InvokeAsync(SelectedValues);
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await JSRuntime.InvokeVoidAsync("select2Interop.initializeSelect2", ElementId);
            await JSRuntime.InvokeVoidAsync("select2Interop.setSelectedValues", ElementId, SelectedValues);
        }
    }

JS-файл, который я использую

Select2JsInterop.js

window.select2Interop = {
    initializeSelect2: function (elementId) {
        $('#' + elementId).select2({
            width: '100%',
            multiple: true
        });
    },

    getSelectedValues: function (elementId) {
        return $('#' + elementId).val();
    },

    setSelectedValues: function (elementId, values) {
        $('#' + elementId).val(values).trigger('change');
    }
};

в файле _host, который я использую

<script src = "~/assets/js/select2jsinterop.js"></script>
    <script src = "_framework/blazor.server.js"></script>

в пользовательском интерфейсе я использую управление, как показано ниже

 <Select2MultiSelect Options = "@SimilarServers" SelectedValues = "@selectedValues" SelectedValuesChanged = "OnSelectedValuesChanged" />
                                        <p>Selected values: @string.Join(", ", @selectedValues)</p>
private void OnSelectedValuesChanged(List<string> newSelectedValues)
    {
        selectedValues = newSelectedValues;
        
    }
private List<SelectedServers> SimilarServers = new()
    {
        new SelectedServers { serverID = 1, server_Name = "atapa222" },
        new SelectedServers { serverID = 2, server_Name = "linuxdata2" }
        
    };
public class SelectedServers
    {
        public int serverID { get; set; }
        public string server_Name { get; set; }
    }

выбранное значение отображает null, почему и как это решить?

Обновленный пост

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

это библиотеки, которые я использую

<script src = "https://code.jquery.com/jquery-3.6.0.min.js"></script>

<!-- Select2 CSS -->
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel = "stylesheet" />

<!-- Select2 JS -->
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>

Где определяется selectedValues и где он используется для отображения чего-либо? Я не вижу связанного кода в вашем вопросе.

ViRuSTriNiTy 19.04.2023 07:13

выбранное значение, определенное в событии OnSelectedValuesChanged, и это событие должно срабатывать при изменении в select2, поскольку добавляется подобный элемент, и событие, определенное для select2 как SelectedValuesChanged = "OnSelectedValuesChanged"

ahmed abdelaziz 19.04.2023 07:31

Вы пытались установить точку останова в OnSelectedValuesChanged, чтобы увидеть, когда он вызывается и что ему передается?

ViRuSTriNiTy 19.04.2023 07:41

да, не ударить и не поймать, не обнаружить, так почему это не обнаружить

ahmed abdelaziz 19.04.2023 08:17

Когда OnSelectedValuesChanged не срабатывает, либо OnSelectionChanged не вызывается, либо вызов await в этом методе никогда не возвращается или прерывается. Убедитесь в этом, используя дополнительные точки останова, взглянув на консоль отладки/консоль разработки браузера.

ViRuSTriNiTy 19.04.2023 09:48

не могли бы вы рассказать мне, как показать или записать console.info(????) не могли бы вы

ahmed abdelaziz 19.04.2023 10:25
console.info() — это вызов JS. Я имел в виду браузерную консоль разработки, в которой можно анализировать и отлаживать JS-код, в Chrome она называется DevTools, см. developer.chrome.com/docs/devtools/open
ViRuSTriNiTy 19.04.2023 15:11

спасибо за поддержку, но мне нужно знать причину проблемы, почему выбранное значение в пользовательском компоненте получает нулевое значение

ahmed abdelaziz 20.04.2023 12:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы серьезно усложняете это. Вам не нужен какой-либо JS или пользовательский элемент управления, чтобы делать то, что вы задали в вопросе.

Blazor поддерживает использование множественного выбора. Вы можете закодировать то, что вы показали, со стандартным InputSelect следующим образом:

@page "/"

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

<InputSelect class = "form-select" @bind-Value=selectedValues>
    @foreach (var option in SimilarServers)
    {
        <option value = "@option.serverID.ToString()">@option.server_Name</option>
    }
</InputSelect>

<div class = "bg-dark text-white m-2 p-1">
    <pre>@GetSelectedValues()</pre>
</div>

@code {
    private int[] selectedValues = new int[] { };

    private string GetSelectedValues()
    {
        List<string> list = new();
        foreach (int x in selectedValues)
        {
            var server = this.SimilarServers.FirstOrDefault(item => item.serverID == x);
            if (server is not null)
                list.Add(server.server_Name);
        }
        return string.Join(", ", list);
    }

    private List<SelectedServers> SimilarServers = new()
    {
        new SelectedServers { serverID = 1, server_Name = "atapa222" },
        new SelectedServers { serverID = 2, server_Name = "linuxdata2" },
        new SelectedServers { serverID = 3, server_Name = "London" },
        new SelectedServers { serverID = 4, server_Name = "Paris" },
        new SelectedServers { serverID = 5, server_Name = "New York" },
    };
}

Обратите внимание, что я привязываюсь к ServerID - как вы делаете в вопросе - поэтому получите список имен серверов, разделенных запятыми, выполнив поиск всех выбранных значений ServerID.

Разве вам не нужен флаг multiple где-нибудь? (О, нвм, я погуглил, бинд достаточно умен, чтобы это сделать)

Bennyboy1973 20.04.2023 05:15

@Bennyboy1973 - нет, если вы используете InputSelect. Он определяет, является ли TValue массивом — _isMultipleSelect = typeof(TValue).IsArray; — и устанавливает соответствующие атрибуты и привязки. - см. github.com/dotnet/aspnetcore/blob/…

MrC aka Shaun Curtis 20.04.2023 09:05

Да, я видел. Мне любопытно, делает ли он какие-либо другие приятные вещи, такие как пейджинг, потому что 200 потенциальных элементов в раскрывающемся списке будут примерно на 180 слишком много.

Bennyboy1973 20.04.2023 12:41

@ Bennyboy1973 - другое решение. Если вам нужен такой контроль, задайте вопрос, и я покажу вам, что я бы сделал.

MrC aka Shaun Curtis 20.04.2023 21:07

Спасибо за предложение, но я уже могу это сделать. Вы хорошо ответили на ОП, но мне интересно, действительно ли раскрывающийся список - его лучший вариант. Я знаю, что меня раздражает прокручивание длинного списка при выборе возраста, потому что я уже не так молод, но мне далеко не 200 лет. :)

Bennyboy1973 21.04.2023 00:13

@ Bennyboy1973 — ОП уже задавал здесь подобный вопрос — stackoverflow.com/questions/76019461/… — и я дал ему другой ответ. Он не ответил ни на один ответ, поэтому я ухожу от вопросов!

MrC aka Shaun Curtis 21.04.2023 09:11

Да, это раздражает. Жемчуг перед свиньями, я думаю!

Bennyboy1973 21.04.2023 13:57

Другие вопросы по теме