Диалоговое окно начальной загрузки с обратным вызовом Ajax

#javascript #jquery #ajax #asp.net-mvc #bootbox

#javascript #jquery #ajax #asp.net-mvc #bootbox

Вопрос:

У меня есть эта кнопка в пользовательском интерфейсе, где клиент откроет модальный. Модал загрузит частичное представление, полученное Ajax.

  $('#btnfeedback').on('click', function(e) {
        e.preventDefault();
        var debateModal;


        $.get('@Url.Action("LoadFeedbackModal", "Home")', function() {

        }).done(function(info) {

            debateModal = bootbox.dialog(
                {
                    message: info,
                    title: '<span class="fa fa-wechat"></span> Leave Feedback',
                    closeButton: true
                });
            debateModal.find('.modal-header').removeClass('modal-header').addClass('modal-header-info');


        }).fail(function() {
            debateModal = bootbox.alert({ message: "Problem try later", size: 'small' });


        });
    });
  

И это мой контроллер:

 [HttpGet]
public ActionResult LoadFeedbackModal()
{
    return PartialView("Partials/_FeedbackModal", new FeedbackVm());
}

[HttpPost]
public ActionResult LoadFeedbackModal(FeedbackVm feedback)
{
    try
    {
        var fb = Mapper.Map<Feedback>(feedback);

        Db.Feedbacks.Add(fb);

        Db.SaveChanges();

        return Json(new { Mensaje = "Thanks for your feedback", Status = true }, JsonRequestBehavior.AllowGet);
    }
    catch (Exception exception)
    {
        return Json(new { Mensaje = "HUbo un problema :( Intenta luego", Status = false }, JsonRequestBehavior.AllowGet);
    }
}
  

И это мое частичное представление:

     @model TuGrietaLive.ViewModels.Admin.Index.FeedbackVm

@using (Html.BeginForm("LoadFeedbackModal", "Home", FormMethod.Post))

{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <p>
        Muchas gracias por tu Feedback. Para nosotros es muy importante.
        <small>Si nos dejas tu correo te podemos contestar :)</small></p>
    <div class="form-group">
        @Html.LabelFor(m => m.FeedbackType, new { @class = "control-label col-md-2 col-xs-12" })
        <div class="col-md-10 col-xs-12">
            @Html.EnumDropDownListFor(model => model.FeedbackType, "Selecciona una Categoria", new { @class = "form-control", name = "FeedbackType" })
            @Html.ValidationMessageFor(model => model.FeedbackType)
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2 col-xs-12">Email <small>(Opcional)</small></label>
        <div class="col-md-10 col-xs-12">
            @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control"} })
            @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Comment, new { @class = "control-label col-md-2 col-xs-12" })
        <div class="col-xs-12 col-md-10 ">
            @Html.EditorFor(model => model.Comment, new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Comment, "", new { @class = "text-danger", rows = 10 })
        </div>
    </div>

    <button type="submit" id="btnsendFeedback" autofocus class="btn btn-block btn-success">
        <span class="glyphicon glyphicon-envelope"></span>Enviar
    </button>
</div>

}
  

Я могу успешно получить представление, и модальный отрисовывает частичное. Теперь я хочу получить ответ сервера после отправки формы.

Как я могу получить сообщение post action? Этот код открывает новое окно с объектом JSON. Я хочу зафиксировать это и открыть модальное. Это меня убивает.

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

1. Я предполагаю, что под «формой» вы имеете в виду форму, показанную в последнем блоке кода?

Ответ №1:

Вам следует изменить тип кнопки btnsendFeedback в вашем диалоговом окне обратной связи на button вместо submit :

 <button type="button" id="btnsendFeedback" autofocus class="btn btn-block btn-success">
    <span class="glyphicon glyphicon-envelope"></span>Enviar
</button>
  

и обрабатывать событие щелчка btnsendFeedback при получении содержимого диалогового окна:

     $('#btnfeedback').on('click', function (e) {
        e.preventDefault();
        var debateModal;


        $.ajax({
            url: '@Url.Action("LoadFeedbackModal", "Home")',
            type: 'GET'
        }).done(function (info) {

            debateModal = bootbox.dialog(
                {
                    message: info,
                    title: '<span class="fa fa-wechat"></span> Leave Feedback',
                    closeButton: true
                });
            debateModal.find('.modal-header').removeClass('modal-header').addClass('modal-header-info');

            $('#btnsendFeedback').on('click', function (e) {
                $.ajax({
                    url: '@Url.Action("LoadFeedbackModal")',
                    type: 'POST',
                    dataType: 'json'
                }).done(function (result) {
                    console.log(result.Mensaje);
                });
            });
        }).fail(function (xhr, status, error) {
            debateModal = bootbox.alert({ message: "Problem try later", size: 'small' });


        });
    });
  

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

1. Боб Даст, пожалуйста, посмотрите мое обновление. Я могу получить частичное представление с помощью Ajax, но я хочу зафиксировать ответ сервера после отправки формы, чтобы я не покидал это представление.

Ответ №2:

Для начала добавьте идентификатор или класс в свою форму, чтобы мы могли подключиться к ее событию отправки:

 @using (Html.BeginForm("LoadFeedbackModal", "Home", FormMethod.Post, new { @id="feedback-form" }))
  

Затем вы можете использовать этот селектор для получения формы:

 var form = $('#feedback-form');
  

В качестве альтернативы вы могли бы использовать find() для получения формы из модального:

 var form = debateModal.find('form');
  

Затем добавьте обработчик события для события отправки формы:

 form.on('submit', function(e){

});
  

Вы захотите отменить собственное событие, а затем использовать serialize() для подготовки ваших данных AJAX:

 form.on('submit', function(e){
    e.preventDefault();

    var data = form.serialize();
});
  

Как только вы это сделаете, вы можете использовать $.post для отправки данных формы, обрабатывая их по своему усмотрению:

 form.on('submit', function(e){
    e.preventDefault();

    var url = form.attr('action');
    var data = form.serialize();

    $.post(url, data)
        .done(function(response, status, jqxhr){
        })
        .fail(function(jqxhr, status, error){
        });
});
  

Наконец, соберите все это вместе в shown.bs.modal событии, чтобы оно подключилось, как только диалоговое окно станет видимым:

 debateModal.on('shown.bs.modal', function(){

    var form = debateModal.find('form');
    form.on('submit', function(e){
        // prevent/cancel the native submit
        e.preventDefault();

        var url = form.attr('action'); // or use @Url.Action(), if you prefer
        var data = form.serialize();

        $.post(url, data)
            .done(function(response, status, jqxhr){

                /* Do what you need to with the response, and then close the modal */

                debateModal.modal('hide');
            })
            .fail(function(jqxhr, status, error){
            });
    });
}
  

Ответ №3:

 $.getJSON('@Url.Action("LoadFeedbackModal", "Home")').done(function(info) {

            debateModal = bootbox.dialog(
                {
                    message: info,
                    title: '<span class="fa fa-wechat"></span> Leave Feedback',
                    closeButton: true
                });
            debateModal.find('.modal-header').removeClass('modal-header').addClass('modal-header-info');


        }).fail(function() {
            debateModal = bootbox.alert({ message: "Problem try later", size: 'small' });
       });
  

Предлагаю использовать getJSON вместо get , по любому вопросу дайте мне знать.

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

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