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:
- 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.
- 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.
- 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>
- 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.
- 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!
Hola Gisela
Muchas gracias, me es de mucha utilidad. Sigue con tus cookbooks de mvc y jquery, que son de mucha ayuda.
Saludos
Muchas gracias por tu comentario Arturo 🙂
Me alegro que te sea de utilidad.
¡Saludos!
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
Hola Luis,
El motivo por el cual muestro los ejemplos con C# es simplemente por comodidad personal 🙂
En cualquier caso no supone mucha complicación pasar de un lenguaje a otro.
Te dejo un link donde tienes un conversor online por si te sirve de ayuda:
http://www.developerfusion.com/tools/convert/csharp-to-vb/
¡Saludos!
como puedo hacer lo mismo pero llamando desde cualquier *.js a un jquery.js
Hola Daniela,
¿Podrías exponer tu caso concreto? No entiendo bien a lo que te refieres…
¡Saludos!