Форма редактирования Blazor запускается с отключенной кнопкой отправки

#blazor

#blazor

Вопрос:

Я использую EditForm в своем приложении Blazor для отправки информации из пустой формы, а также формы, которая была инициализирована данными, извлеченными из базы данных. Когда я инициализирую форму данными из базы данных, я хочу, чтобы кнопка отправки была отключена до тех пор, пока не будет выполнен какой-либо ввод. Если ввод не выполняется, кнопка должна оставаться отключенной, поскольку нет новой информации для сохранения.

Итак, мне нужен какой-то детектор ввода, на котором я могу активировать отключенный флаг кнопки отправки. Каков правильный способ достижения этого? Итак, мне нужно что-то вроде этого:

 <EditForm Model="MyModel">
   <InputText type="text" @bind-value="x" @oninput="OnInput"/>
</EditForm>

private void Oninput(){
 IsDisabled = false;
}
 

Каков правильный способ достижения этого, который работает со всеми видами входных данных (ввод текста, радио, флажки и т. Д.)

Ответ №1:

Итак, после просмотра различных вариантов решение, по-видимому, заключается в следующем. Я хочу начать с отключенной кнопки отправки / сохранения и включить ее только при наличии ввода. Одним из способов достижения этой цели является использование события EditContext OnFieldChanged . Вот так:

 protected async override Task OnInitializedAsync()
{
        editContext = new EditContext(allRisksItem);
        editContext.OnFieldChanged  = EditContext_OnFieldChanged;
        ....
}

private void EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
{
        disable_button = false;

}
 

Событие OnFieldChanged запускается, когда EditCotext обнаруживает изменение поля в форме. Я думаю, что я также сталкивался с запуском событий при вводе, но пока этого не пробовал. Таким образом, с этим решением нет необходимости иметь @oninput в каждом поле для определения ввода и т.д.

Надеюсь, это поможет людям, которые ищут решение этой проблемы. Спасибо тем, кто дал и другие предложения.

Ответ №2:

вы можете использовать флаг is modified в форме

 <EditForm Model="_model" Context="_Context">
    <InputRadioGroup @bind-Value="@_model.SelectedManufacturer">Manufacturer:<br>
        @foreach (var manufacturer in Manufacturers)
        {
            <InputRadio Value="manufacturer" />@manufacturer<br>
        }
    </InputRadioGroup> 

     <button type="submit" disabled="@(!_Context.IsModified())">Submit</button>
</EditForm>
 

@code {

 EditContext _Context { get; set; }


*//code below just to make the form work*
List<String> Manufacturers = new List<string> { "Ford", "Toyota", "Tesla" };
FormClass _model = new FormClass();

class FormClass
{
    public String SelectedManufacturer { get; set; }
}
 

}

Комментарии:

1. Итак, вы предлагаете вместо того, чтобы с самого начала отключать кнопку отправки, я оставляю кнопку в рабочем состоянии и при нажатии кнопки отправки проверяю, была ли изменена форма, а затем действую соответствующим образом?

2. Я изменил код, чтобы переключить отключенный флаг на кнопке, используя контекст editform напрямую.

Ответ №3:

(Предварительное примечание: на самом деле вам не нужно оборачивать все в элементы управления EditForm или использовать версии элементов управления Blazor, если вы не собираетесь использовать все функции проверки, используя аннотированные данные в моделях отображения и так далее) Вы также можете использовать ванильные элементы управления html.

Я делаю это тремя способами (никаких обещаний, что это лучшая практика Blazor)

(1) поместите элемент управления внутри блока if.

 if (!IsDisabled)
{
// My input stuff here
}
 

«Где эта кнопка? Думаю, мне лучше сначала сделать выбор! »

(2) Несмотря на то, что он жалуется на плохую разметку, вы можете установить значение Disabled для логических значений

 <someinput disabled="@IsDisabled">
 

Компилятор может настаивать на том, что disabled не принимает логические значения, но, по-видимому, Blazor поддерживает вас, потому что он отлично отображает.

(3) Не отключайте элемент управления, но используйте его как возможность предоставить информацию пользователю. Установите ярлык красного цвета и установите его текст на «Невозможно отправить форму до (чего-то)».


Одна вещь, которую я обычно делаю, когда хочу использовать текст на лету, — это добавить обработчик события keyup для перехвата клавиши Enter. Нет особого смысла включать элемент управления, когда кто-то только что ввел первую букву своего имени. (Хотя, честно говоря, Blazor настолько отзывчив, что я обычно вообще пропускаю кнопку и просто продолжаю и начинаю обрабатывать текст):

 <InputText type="text" @bind-value="x" @oninput="OnInput" @onkeyup="CheckText"/>

    void CheckText(KeyboardEventArgs e) 
    {
        if (e.Code == "Enter")
        {
            // IsDisabled = false;
            // StateHasChanged();
            DoMyTextStuff (x); 
        }
    }