Llamar a un Ajax.ActionLink desde JQuery con temporizador

Hace unos días me encontré con un caso en el que era necesario llamar de forma asíncrona a una acción de un controlador ASP.NET MVC, para refrescar una pantalla con los nuevos resultados. Además, era necesario que se hiciera cada X tiempo para que no me denegaran el servicio.
Desconozco si existe una forma más óptima de realizar esta funcionalidad en ASP.NET MVC pero, si sirve de ayuda, muestro el código de mi solución “temporal” a este caso en concreto:

  1. Creo un enlace con las propiedades de Ajax de la siguiente manera.
    <%=Ajax.ActionLink("Refresh","RefreshTags", new { tag = ViewData["tags"] }, new AjaxOptions { HttpMethod = "Post", OnBegin = "onBeginRetrievingTags", OnComplete = "onCompleteRetrivingTags", UpdateTargetId = "tweets" },new{Id="ActionLinkTags"})%>

    Para más información sobre Ajax con ASP.NET MVC, puedes consultar este otro post.

  2. Por el lado del controlador, creo la acción que va a devolver el listado actualizado, en este caso, de tweets.
    [HttpPost]
    public ActionResult RefreshTags(string tag)
    {
    ViewData["tags"] = tag;
    List<Tweet> entries = _serviceTweet.FilterBy(tag);
    return PartialView("TweetList", entries);
    }

    Si observamos detenidamente la acción, vemos que nos redirige a una vista parcial llamada TweetList donde muestro el resultado obtenido.

  3. Ejecutamos la aplicación, vemos que al renderizar la página en cuestión, nos devuelve el siguiente elemento para nuestro link.
    <a Id="ActionLinkTags" href="/Tweet/RefreshTags?tag=aspnetmvc" onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'Post', updateTargetId: 'tweets', onBegin: Function.createDelegate(this, onBeginRetrievingTags), onComplete: Function.createDelegate(this, onCompleteRetrivingTags) });">Refresh</a>
  4. Para llevar a cabo la llamada a través de JQuery, en un archivo js, he creado las siguientes funciones.
    function launchConfigTags() {

    $("#ActionLinkTags").dblclick(function(e) {

    Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(e),
    {
    insertionMode: Sys.Mvc.InsertionMode.replace,
    httpMethod: 'Post',
    updateTargetId: 'tweets',
    onBegin: Function.createDelegate(this, onBeginRetrievingTags),
    onComplete: Function.createDelegate(this, onCompleteRetrivingTags)
    });
    });

    Timer();
    }

    function Timer() { setTimeout("refreshTags()", 60000); }

    function refreshTags() { $("#ActionLinkTags").trigger("dblclick"); }

    De manera conjunta, realizan exactamente la misma llamada que si pulsaramos el link con un tiempo estimado de un minuto.

  5. Si queremos que el refresco se realice desde el primer momento que la página está disponible, podemos lanzar la función que bindea el evento doble click al link en el evento ready, iniciando de esta manera el ciclo de llamadas.
    $(document).ready(function() { launchConfigTags(); });

Espero que sea de utilidad.

¡Saludos!

6 comentarios en “Llamar a un Ajax.ActionLink desde JQuery con temporizador”

  1. Hola Gisela

    bueno esta bien interesante tu aplicacion pero no se puede hacer una pero visual basic bueno ando buscando y buscando pero no se por q todos usan mas c# sera por es muy parecido php ?

    bueno te agradeceria mucho si isiera una aplicacion con ajax pero vb .net

    q tengas un buen dia luis

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *