Ajax post serialize () no incluye el nombre y el valor del botón

Mi $ .ajax () no está serializando el nombre y el valor del botón.

Tengo una forma muy simple. Tiene un botón y un cuadro de texto.

Cuando llamo $(this).serialize() , el cuadro de texto está incluido en la cadena pero no en el botón.

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

Observé durante la investigación que, con otras preguntas, la razón principal era que faltaba un elemento de nombre en el botón. Tengo un elemento de nombre.

También he intentado hacer un muy simple que no cambió nada.

solución que utilicé

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

serialize() jQuery es bastante explícito acerca de NO codificar botones o enviar entradas, porque no se consideran “controles exitosos”. Esto se debe a que el método serialize () no tiene forma de saber qué botón (¡si alguno!) Se hizo clic.

Logré solucionar el problema capturando el clic del botón, serializando el formulario y luego añadiendo el nombre codificado y el valor del botón al resultado.

 $("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); }); 

Aquí hay una solución general que buscará una entrada en el formulario que contiene el botón. Si existe, establecerá el valor; de lo contrario, creará una entrada oculta y establecerá su valor. Esto también puede ser útil si no desea enviar el formulario de inmediato.

 $(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 = $('', { type:'hidden', name:$button.attr('name') }); $input.insertAfter($button); } $input.val($button.val()); });