Я работаю на стороне сервера 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>
выбранное значение, определенное в событии OnSelectedValuesChanged, и это событие должно срабатывать при изменении в select2, поскольку добавляется подобный элемент, и событие, определенное для select2 как SelectedValuesChanged = "OnSelectedValuesChanged"
Вы пытались установить точку останова в OnSelectedValuesChanged
, чтобы увидеть, когда он вызывается и что ему передается?
да, не ударить и не поймать, не обнаружить, так почему это не обнаружить
Когда OnSelectedValuesChanged
не срабатывает, либо OnSelectionChanged
не вызывается, либо вызов await
в этом методе никогда не возвращается или прерывается. Убедитесь в этом, используя дополнительные точки останова, взглянув на консоль отладки/консоль разработки браузера.
не могли бы вы рассказать мне, как показать или записать console.info(????) не могли бы вы
console.info()
— это вызов JS. Я имел в виду браузерную консоль разработки, в которой можно анализировать и отлаживать JS-код, в Chrome она называется DevTools, см. developer.chrome.com/docs/devtools/openспасибо за поддержку, но мне нужно знать причину проблемы, почему выбранное значение в пользовательском компоненте получает нулевое значение
Я думаю, вы серьезно усложняете это. Вам не нужен какой-либо 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 - нет, если вы используете InputSelect
. Он определяет, является ли TValue
массивом — _isMultipleSelect = typeof(TValue).IsArray;
— и устанавливает соответствующие атрибуты и привязки. - см. github.com/dotnet/aspnetcore/blob/…
Да, я видел. Мне любопытно, делает ли он какие-либо другие приятные вещи, такие как пейджинг, потому что 200 потенциальных элементов в раскрывающемся списке будут примерно на 180 слишком много.
@ Bennyboy1973 - другое решение. Если вам нужен такой контроль, задайте вопрос, и я покажу вам, что я бы сделал.
Спасибо за предложение, но я уже могу это сделать. Вы хорошо ответили на ОП, но мне интересно, действительно ли раскрывающийся список - его лучший вариант. Я знаю, что меня раздражает прокручивание длинного списка при выборе возраста, потому что я уже не так молод, но мне далеко не 200 лет. :)
@ Bennyboy1973 — ОП уже задавал здесь подобный вопрос — stackoverflow.com/questions/76019461/… — и я дал ему другой ответ. Он не ответил ни на один ответ, поэтому я ухожу от вопросов!
Да, это раздражает. Жемчуг перед свиньями, я думаю!
Где определяется
selectedValues
и где он используется для отображения чего-либо? Я не вижу связанного кода в вашем вопросе.