Blazor EditForm Обработчик отправки не вызывается, когда форма находится в модальном конце начальной загрузки, кнопка отправки является командой модального отклонения - PullRequest
1 голос
/ 25 мая 2019

Давайте рассмотрим следующую страницу в приложении Blazor на стороне клиента:

@page "/test"

<div id="modalDialog" class="modal" tabindex="-1" role="dialog">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-body">
                <EditForm Model="@model" OnSubmit="@SubmitHandler">
                    <div class="form-group d-flex justify-content-between">
                        <label class="col-form-label col-3" for="editDT">Time</label>
                        <InputText bind-Value="@model" id="editDT" Class="form-control" />
                    </div>
                    <button type="submit" class="btn btn-primary" @*data-dismiss="modal"*@>Submit</button>
                </EditForm>
            </div>
        </div>
    </div>
</div>
<button data-toggle="modal" data-target="#modalDialog" class="btn btn-primary">Open</button>

@functions {
    private string model { get; set; } = "Model";
    private void SubmitHandler()
    {
        Console.WriteLine("Submit");
    }
}

Когда я нажимаю кнопку «Открыть», модальное изображение отображается, как и ожидалось. Затем, нажав кнопку «Отправить» в модальном режиме, «Отправить» будет напечатано в консоли браузера, как и ожидалось. Но мне нужно также закрыть модальное окно, когда я нажимаю Отправить, чтобы я раскомментировал информацию об отклонении данных. Теперь модальный режим закрывается, как и ожидалось, но обработчик Submit больше не вызывается (консоль браузера остается пустой).

1) Это ожидаемое поведение?

2) Если да, есть ли способ закрыть модальное окно в обработчике отправки без взаимодействия с JavaScript?

3) Если нет, есть ли другой способ закрыть модальное окно и вызвать обработчик Submit при нажатии кнопки Submit, опять же без js interop?

Ответы [ 3 ]

2 голосов
/ 25 мая 2019

Ваша самая большая проблема заключается в использовании начальной загрузки как есть. BS использует свой собственный JS для управления DOM, это не будет работать с Blazor, так как Blazor должен контролировать DOM. То же, что Angular, React или Vue. Если что-то еще изменяет DOM, то, как вы обнаружите, могут происходить странные вещи.

Я бы предложил заменить одну из библиотек начальной загрузки Blazor, например, BlazorStrap . Или, если вы только после модального, я написал один под названием Blazored.Modal

1 голос
/ 25 мая 2019

Я полагаю, что dismiss = "modal" является жизнеспособным, только если вы используете <button type="button"></button>, но это не включит "отправку формы". Чтобы действительно решить эту проблему, я бы предложил вам использовать тег <form> и <button type="button"> тег вместо.

Но лучшее решение - следовать тому, что предложил Крис Сэйнти в своем ответе.

Могу добавить, что мне не рекомендуется вставлять диалоговое окно Bootstrap в Blazor, когда такой объект легко реализовать в Blazor ...

Следовательно, я бы предложил вам самим создать компонент диалогового окна, шаблонный, возможно, основанный на диалоговом окне Bootstrap ... В конце концов, я думаю, что, как и все мы, вы находитесь в фазе обучения Blazor. Так что это может быть хорошим упражнением.

Надеюсь, это поможет ...

0 голосов
/ 26 мая 2019

Все хорошие предложения.Однако для полноты картины я нашел способ добиться того, чего хотел, даже если это не очень элегантный обходной путь:

@page "/test"
@using System.ComponentModel.DataAnnotations;

<div id="modalDialog" class="modal" tabindex="-1" role="dialog">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-body">
                <EditForm EditContext="@EC">
                    <DataAnnotationsValidator />
                    <ValidationSummary />

                    <div class="form-group d-flex justify-content-between">
                        <label class="col-form-label col-3" for="editDT">Time</label>
                        <InputText bind-Value="@model.Name" id="editDT" Class="form-control" />
                    </div>
                    @if (EC.Validate())
                    {
                        <button type="button" onclick="@SubmitHandler" class="btn btn-primary" data-dismiss="modal">Submit</button>
                    }
                    else
                    {
                        <button type="button" onclick="@SubmitHandler" class="btn btn-primary">Submit</button>
                    }
                </EditForm>
            </div>
        </div>
    </div>
</div>
<button data-toggle="modal" data-target="#modalDialog" class="btn btn-primary">Open</button>

@functions {
    public class ModelClass
    {
        [Required]
        public string Name { get; set; }
    }
    private ModelClass model { get; set; } = new ModelClass { Name = "My Name" };
    private EditContext EC { get; set; }
    private void SubmitHandler()
    {
        Console.WriteLine("Submit");
    }
    protected override void OnInit()
    {
        EC = new EditContext(model);
        base.OnInit();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...