Выпадающий список выбора опции не отображает выбранный параметр

#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. Это простое и рабочее решение, вы можете продолжать искать лучший способ. Я сделал, что мог. Второй ответ ниже выглядит лучше.