#c# #html #blazor
#c# #HTML #blazor
Вопрос:
У меня есть приложение Blazor, которое заполняет 6 выпадающих списков выбора опции данными из базы данных. Три из них заполнены датой и временем из списка строк.
Когда я выбираю дату и время, они не отображаются в выпадающем списке. После выбора даты и времени выпадающий список остается пустым, но значение фактически выбрано, и привязка работает. Он просто не отображается.
Если я удалю «bind = @ …», он отображается правильно. Кто-нибудь еще сталкивался с этим, и как вы это решили?
<select bind="@Innput.Klokkeslett1">
<option value="@(0)">Tid1</option>
@foreach (var tid1 in tidListe)
{
<option value="@tid1">@tid1</option>
}
</select>
Комментарии:
1. Пожалуйста, покажите весь ваш код…
Ответ №1:
Следует отметить две вещи: select
используется строковое значение, и это значение должно соответствовать option
значению. Итак, если ваше поле Innput.Klokkeslett1 — это DateTime, вам нужно будет использовать свойство для обработки привязки / преобразования между string и DateTime. Если вы убедитесь, что используете явный формат даты для option
значений, и ваше свойство возвращает это значение в том же формате даты, тогда select сможет сопоставить его value
с одним из него option
values
и отобразить соответствующий текст, который может быть отформатирован любым удобным для вас способом.
<select bind="@MySelectProxy">
<option value="@(0)">Tid1</option>
@foreach (var tid1 in tidListe)
{
<option value="@tid1.ToString("yyyy-MM-dd HH:mm:ss")">@tid1</option>
}
</select>
@functions
{
string MySelectProxy {
get => Innput.Klokkeslett1.ToString("yyyy-MM-dd HH:mm:ss");
set => DateTime.TryParse(value, out Innput.Klokkeslett1);
}
}
Комментарии:
1. Я не пробовал ваше решение, но оно заставило меня задуматься, и я обнаружил, что допустил глупую ошибку в своем коде, заполнив даты из базы данных в список строк, и это вызвало некоторые проблемы. Как только я изменил это на список даты и времени в контроллере и так далее, Это решило все, и теперь даты отображаются правильно при выборе
2. Может помочь другим, испытывающим трудности: вам нужно использовать код Blazor в вашем <option>, чтобы повторная привязка сработала. Мне потребовалась вечность, чтобы обнаружить. Поэтому используйте @foreach при заполнении ваших <параметров>, как в этом примере.
Ответ №2:
<select onchange="@ComboSelectionChanged">
<option value="0" selected>
@list[0]
</option>
@for (int i = 1; i < list.Count; i )
{
<option value="@i">
@list[i]
</option>
}
</select>
public void ComboSelectionChanged(UIChangeEventArgs e)
{
if (int.TryParse(e.Value.ToString(), out int index))
{
SelectedStyleIndex = index
//now you know which one is selected
}
}
Комментарии:
1. Вы не ответили на его вопрос о том, почему выбранный элемент не отображается, хотя «значение фактически выбрано, и привязка работает».
2. Кстати, вот что Стив Сендерсон должен сказать о том, что вы сделали: «Если бы это был я, я бы не хотел использовать события onchange, анализировать целые числа и вообще полагаться на DOM для отслеживания выбранного индекса выпадающих списков. Вместо всего этого я бы предпочел смоделировать выбор на C # и использовать двухсторонние привязки Blazor для синхронизации с DOM «.
3. Это простое и рабочее решение, вы можете продолжать искать лучший способ. Я сделал, что мог. Второй ответ ниже выглядит лучше.