2.5 KiB
Title | Date | Slug | Tags |
---|---|---|---|
Rendu partiel (et asynchrone) avec ASP MVC & jQuery | 2015-08-17 | partial-render-using-asynchronous-js | dev, code, jquery, js |
En faisant du chargement asynchrone, on donne l'impression à l'utilisateur que la page se charge plus rapidement qu'elle ne se charge réellement: le serveur répond d'abord une première fois avec le squelette (et le contenu) de la page racine, puis une fois que cette page est complètement chargée, on va récupérer le reste des données (équivalent du $(document).ready(function(...) { ... });
.
Au niveau des contrôleurs, on va définir une première méthode (qui retourne un ActionResult
) et qui envoie les données vers une vue pour l'affichage de la page principale. On définit ensuite une deuxième méthode, qui retourne un objet de type PartialViewResult
(mais qui fonctionne grosso-modo de la même manière):
public ActionResult Details(int? id)
{
/* fetch objects */
return View(...);
}
public PartialViewResult GetAdUser(string samAccountName)
{
/* fetch objects */
return PartialView(...);
}
Dans la page principale (celle qui correspond à la méthode /Details), il faut:
- Inclure jQuery
- Ecrire un petit morceau de code pour charger les données une fois que la page est complètement chargée
Inclure jQuery
<script src="/Assets/js/jquery-1.8.2.js" type="text/javascript"></script>
Oui. C'est tout.
Le morceau de code
En fait, on doit d'abord définir l'emplacement où le résultat sera stocké. Soit avec une classe, soit avec un identifiant. Par exemple:
<div class="partialContent" data-url="/GetAdUser?samAccountName=fred">
Loading...
</div>
Le Loading...
peut être remplacé par une petite image qui s'agite, ça rendra très très bien. Dans cet exemple, on va utiliser l'attribut class
pour identifier les éléments devant être appelés après le chargement de la page, et l'attribut data-url
pour initier l'URL à contacter.
Finalement, le code Javascript permettant d'opérer la magie est le suivant:
<script type="text/javascript">
$(document).ready(function(e) {
$(".partialContent").each(function (index, item) {
var url = $(item).data("url");
if (url && url.length > 0)
$(item).load(url);
});
});
</script>
En gros, pour chaque élément du sélecteur $(".partialContent")
, on récupère la valeur de l'attribut data-url
et on charge le contenu de cette action en dessous de l'élément actuel. Ici, le résultat va donc remplacer le Loading...
.