Modèle de vue partielle MVC non rafraîchissant

J’ai une vue partielle qui est en cours de chargement dans un modal jQuery dans asp.net MVC 3. Le problème est que la vue n’est pas rafraîchie correctement. Voici l’ordre des événements:

1) La vue principale contient un tableau répertoriant les différents enregistrements d’événements. Il y a un lien sur chaque ligne du tableau pour montrer le détail de l’événement. 2) Lorsque le lien sur cette table est cliqué, la vue partielle est chargée dans le modal.

Cela fonctionne bien dans certains cas, dans d’autres, le chargement du modèle prendra beaucoup de temps. Après avoir fermé la vue partielle / modale et cliqué sur un autre lien de la table dans la vue principale, la vue partielle se chargera en affichant les données du chargement précédent. Ce n’est pas rafraîchissant correctement.

Définition de Modal sur la vue principale: Chargement en cours, veuillez patienter …

 $(document).ready(function () { $("#EventRegistrantSummary").dialog({ bgiframe: true, autoOpen: false, height: 500, width: 980, resizable: false, modal: true }); }); function showEventRegistrantSummary(id) { $.get("/Event/EventRegistrantSummary/" + id, function (data) { $("#EventRegistrantSummary").html(data); }); $("#EventRegistrantSummary").dialog('open'); return false; }  

Manette:

  public PartialViewResult EventRegistrantSummary(Guid id) { ModelState.Clear(); Event e = db.Events.Single(ev => ev.ID == id); return PartialView(e); } 

Vue partielle:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>  
Registration Summary:
Overview
Total Registrants:

Toute aide est très appréciée.

Utilisez l’action OutputCacheAtsortingbute sur votre contrôleur pour désactiver la mise en cache.

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] public PartialViewResult EventRegistrantSummary(Guid id) { ModelState.Clear(); Event e = db.Events.Single(ev => ev.ID == id); return PartialView(e); } 

Cela ressemble à un problème de mise en cache. Les requêtes GET peuvent être mises en cache par certains navigateurs. Essayez de remplacer l’appel $.get AJAX par un $.ajax en définissant cache: false ou essayez une requête $.post :

 $.ajax({ url: '<%= Url.Action("EventRegistrantSummary", "Event") %>', type: 'GET', cache: false, data: { id: id }, success: function(data) { $('#EventRegistrantSummary').html(data); } }); 

De plus, vous n’avez pas besoin d’effacer le ModelState dans votre action EventRegistrantSummary car vous ne modifiez aucune des valeurs.

Une autre approche consiste à attacher un nombre aléatoire à la chaîne de requête lorsque vous utilisez les assistants MVC intégrés à la construction.

Par exemple:

 @Ajax.ActionLink("LinkText", "Index", "Home", new { rnd = DateTime.Now.Ticks }, new AjaxOptions { UpdateTargetId = "main", OnSuccess = "pageloadSuccess" }) 

Ou pour un formulaire:

 using (Ajax.BeginForm("EditUpdate", new { rnd = DateTime.Now.Ticks }, new AjaxOptions { UpdateTargetId="Target", InsertionMode= InsertionMode.Replace})) 

Ce n’est pas toujours la meilleure façon de faire les choses, mais si vous voulez éviter de marquer chacune de vos méthodes (si vous avez beaucoup à éviter des problèmes de cache) ou d’utiliser jQuery pour gérer la soumission vous-même, c’est une solution rapide.