Есть ли возможность привязать форму к модальному окну начальной загрузки без использования вызова load?

#javascript #jquery #ajax #modal-dialog #bootstrap-modal

#javascript #jquery #ajax #modal-dialog #bootstrap-модальный

Вопрос:

Я использую ajax для отправки запроса и последующего открытия модального окна начальной загрузки. Проблема в том, что когда я использую ajax, я делаю запрос к своему контроллеру, а возврат (модальный контент) Я загружаю следующим образом:

 //modal loading
$('#contentModalFinanceiroParcela').html(data);

//exibição da modal
$('#modalFinanceiroParcela').modal({
    keyboard: true,
}, 'show');
 

Пока все идеально. Проблема в том, что с этого момента я не могу привязать форму для регистрации события отправки формы. В функции bindFormFinanceiroParcela, сколько бы я ни передавал «диалог», привязка не работает.

bindFormFinanceiroParcela(document.getElementById(«contentModalFinanceiroParcela»));

Поискав по форумам, я обнаружил, что процесс работает, если я загружаю модал с помощью команды «load», как показано ниже, но я не могу сделать это так, иначе он отправит второй запрос к контроллеру, потому что ранее я уже использовал ajax .

 //That way it works, but I can't use it.
$('#contentModalFinanceiroParcela').load(url, function () {
    $('#modalFinanceiroParcela').modal({
        keyboard: true
    }, 'show');

    // Inscreve o evento submit
    bindFormFinanceiroParcela(this);

    stopLoadPage();
});
 

Есть ли вероятность, что я смогу привязать форму без использования команды «load», упомянутой в приведенном выше скрипте?

     function openModalFinanceiroParcelaSemURL(data) {
    startLoadPage();

    //Create the modal window block in the body of the page
    if (!$("#modalFinanceiroParcela").data('bs.modal'))
        CreateModalFinanceiroParcela();

    //Load modal content via ajax request
    $('#contentModalFinanceiroParcela').html(data);

    $('#modalFinanceiroParcela').modal({
        keyboard: true,
    }, 'show');

   bindFormFinanceiroParcela(document.getElementById("contentModalFinanceiroParcela"));

   
    
    stopLoadPage();
}

function bindFormFinanceiroParcela(dialog) {
$('form', dialog).submit(function (e, i) {
    if ($(this).valid() || i) {
        startLoadOneMoment();
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (result) {
                if (result.success) {
                     window.location = window.location;                       
                } else {
                    $('#contentModalFinanceiroParcela').html(result);
                    bindFormFinanceiroParcela();
                }
                stopLoadOneMoment();
            }
        });
        return false;
    } else {
        return false;
    }
});

function CreateModalFinanceiroParcela() {
var html = '<div class="modal modal-primary modal-system" tabindex="-1" role="dialog" id="modalFinanceiroParcela" data-backdrop="static"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="content-modal-system" id="contentModalFinanceiroParcela"></div></div></div></div>';

$("body").append(html);
}
 

УДАЛЕНИЕ БРИТВОЙ:

 @using Retaguarda.Domain.Enuns
@model Retaguarda.Application.ViewModels.Financeiro.FinanceiroParcela.FinanceiroParcelaViewModel
@{
    ViewData["Title"] = "Excluir Parcela";
    Layout = null;
}
<div>
    <form asp-action="Delete" id="frm-excluir-financeiro-parcela">
        @Html.AntiForgeryToken()

        <div class="modal-shadow">
            <div class="modal-header modal-header-primary">
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
                <h4><i class="modal-title text-center glyphicon glyphicon-trash"></i> @ViewData["Title"] </h4>
            </div>
            <div class="panel">
                <div class="panel-body  container-fluid pt-15 pl-15 pr-15">
                    <div class="form-horizontal">
                        <vc:summary />
                        <br />
                        <div class="message-delete">
                            @Html.HiddenFor(model => model.Id, new { id = "hid-financeiro-parcela-id" })
                            <i class="icon fa-trash" aria-hidden="true"></i>
                            <p>
                                Tem certeza de que deseja excluir a parcela @(Model.Parcela)?<br />
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <div class="modal-footer">
                <div class="col-md-offset-2 col-md-10">
                    <div class="float-right">
                        <div class="btn-group btn-group-sm mr-auto"
                             role="group">
                            <div class="btn-group btn-group-sm" role="group">
                                @*<button id="btn-excluir-financeiro-parcela" type="submit" class="btn btn-success"><i class="icon wb-check"></i> Excluir </button>*@
                                <button id="btn-excluir-financeiro-parcela" type="button" class="btn btn-success"><i class="icon wb-check"></i> Excluir </button>
                                <button id="btn-cancelar-financeiro-parcela" class="btn btn-danger" data-dismiss="modal"><i class="icon wb-close"></i> Cancelar </button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </form>
</div>

<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>


@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
 

Вызов Ajax

 $('#dtFinanceiroParcela').on('click', 'tr .btn-excluir-financeiro-parcela', function (e) {
e.preventDefault();

startLoadOneMoment();

var id = $(this).attr('data-id');
var data = { id: id };
var dataURL = jQuery.param(data);

$.ajax({
    url: "/financeiro-parcela-gerenciar/remover-financeiro-parcela/"   id,
    type: "GET",
   // data: dataURL,
    contentType: "application/json",
    async: false,
    success: function (result) {
        if (typeof result.success !== 'undefined') {
            if (!result.success) {
                stopLoadOneMoment();

                swal("Oops", result.message, "error");

                return false;
            }
        }
       // alert(this.url);
        stopLoadOneMoment();
        openModalFinanceiroParcelaSemURL(result);
        
        return false;
    },
    error: function () {
        stopLoadOneMoment();
        alert("Oops! Algo deu errado.");
        return false;
    }
});
 

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

1. Не могли бы вы создать stackblitz.

2. Как выглядит html модального содержимого?

3. Привет, Мартин Годзина! обновил сообщение 🙂

4. Похоже, что в вашей форме нет кнопки отправки из-за комментария кнопки отправки @ *<кнопка … тип =»отправить» … *@ Содержит ли ваша форма кнопку отправки при проверке вашего html?

5. @Martin Godzina, отправка выполняется через ajax, поэтому она была удалена с кнопки (это не проблема, он он). Проблема в том, что функция bindFormFinanceiroParcela не работает, когда отображается модальный параметр. Это работает, если я загружаю с помощью jquery, но если я загружаю contentModal следующим образом: «$ (‘# contentModalFinanceiroParcela’). Html (данные)» функция bindFormFinanceiroParcela не работает.

Ответ №1:

Ваша форма внутри razor не содержит кнопки отправки, потому что она закомментирована.

 @*<button id="btn-excluir-financeiro-parcela" type="submit" class="btn btn-success"><i class="icon wb-check"></i> Excluir </button>*@
 

Удалите комментарий или измените тип другой кнопки на «отправить»

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