Подтвердить что ты не робот

Ajax post serialize() не включает имя и значение кнопки

My $.ajax() не сериализует имя и значение кнопки.

У меня очень простая форма. Он имеет кнопку и текстовое поле.

<form action="/MyController/MyAction" data-ajax-method="post" 
  data-ajax-mode="replace" data-ajax-target="#mypartial" id="myform" 
  method="post">
        <button type="submit" class="positive" name="button" value="click1">
            <img src="/Id/Images/Icons/16/enabled/tick.png" title="click1">
            Click
        </button>
        <input id="txtBlah" name="txtBlah" type="text" value="hello">
    </div>
</form>

Когда я вызываю $(this).serialize(), текстовое поле включено в строку, но не кнопку.

Debug.Log($(this).attr('id')); //== 'myform'
Debug.Log("data: " + $(this).serialize()); //== data: txtBlah=hello

В ходе исследования я отметил, что с другими вопросами основная причина заключалась в отсутствии элемента имени на кнопке. У меня есть элемент name.

Я также пробовал сделать очень простой <input type="submit" name="mysubmit" />, который ничего не менял.

решение, которое я использовал

var buttonSubmit = (function (e)
{
    e.preventDefault();
    var form = $(this).closest('form');
    form.attr('data-button-name', $(this).attr('value'));
    form.closest('form').submit();
});
4b9b3361

Ответ 1

jQuery serialize() довольно подробно говорит о кнопках НЕ кодирования или вводит входы, потому что они не считаются "успешными элементами управления". Это связано с тем, что метод serialize() не имеет возможности узнать, какая кнопка (если есть!) Была нажата.

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

$("button.positive").click(function (evt) {
    evt.preventDefault();

    var button = $(evt.target);                 
    var result = button.parents('form').serialize() 
        + '&' 
        + encodeURI(button.attr('name'))
        + '='
        + encodeURI(button.attr('value'))
    ;

    console.log(result);
});

Ответ 2

Здесь доступно решение, которое будет искать входной сигнал в кнопке, содержащей форму. Если он существует, он установит значение, иначе он создаст скрытый ввод и установит его значение. Это также может быть полезно, если вы не хотите немедленно отправлять форму.

$(document).on('click', '[name][value]:button', function(evt){
    var $button = $(evt.currentTarget),
        $input = $button.closest('form').find('input[name="'+$button.attr('name')+'"]');
    if(!$input.length){
        $input = $('<input>', {
            type:'hidden',
            name:$button.attr('name')
        });
        $input.insertAfter($button);
    }
    $input.val($button.val());
});