viernes, enero 27, 2012

Guardados parciales de formularios web mediante Ajax

La forma de guardar un formulario web sin hacer un submit y por lo tanto se recargue la página, es mediante ajax. Esto puede ser útil si queremos que lo que está haciendo el usuario no se pierda si por accidente sale de la página. Por último tendremos que decidir cuándo hacer estos guardados parciales: cada cierto tiempo, cuando cambie cierto valor...

Código javascript:


Untitled Page
// 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");
    }
}