Código javascript:
// Variable donde se guardan los valores de la última grabación automática. var _savedFormValues;
// Carga del formulario (jQuery) $(document).ready(function () { // Guardado automático (lanzado por el sistema). Mientras no se diga lo contrario (=0) los guardados son de tipo automático (=-1) $('#GuardadoAutomatico').value = -1; // Inicializar campos _savedFormValues _savedFormValues = $(document.forms[0]).serialize(); }
// Guardado asíncrono (no se espera al retorno) function guardarAutomatico() { // Serializar los valores actuales de la pantalla currentFormValues = $(document.forms[0]).serialize(); // Comparar los valores actuales con los últimos guardados if (currentFormValues != _savedFormValues) { // Lanzar POST al controller, mediante ajax (asíncrono y transparente para el usuario) $.ajax({ type: 'POST', url: $(this).attr('action'), cache: false, data: currentFormValues //,success: function (data) { //$('#result').html(data); // result es un campo del formulario donde escribir el retorno del POST; en este caso no se utiliza. //} }); // Actualizar los últimos valores guardados _savedFormValues = currentFormValues; } }
NOTAS: Obsérvese...
1) Cómo se recogen todos los valores del formulario y se serializan para pasarlos al post: $(document.forms[0]).serialize()
2) Si no hay cambios, no se hace el post.
3) El campo GuardadoAutomatico, con el que controlaremos si el guardado es automático/parcial o no. Sólo en el guardado final deberemos establecerlo a 0.
El controller sería algo así:
[HttpPost] public ActionResult Edit(MiViewModel viewModel) {
...
if (viewModel.GuardadoAutomatico == -1) { // Guardar parcial automático
...
// No redirigir return null; } else {
// Guardar normal lanzado por el usuario
...
// Redirigir a donde toque... return RedirectToAction("Index", "PáginaX"); }
}