2010-01-08 6 views
1

Depuis la mise à niveau de mvc 2 beta 2 vers rc, j'ai des problèmes avec une soumission ajax dans Internet Explorer. Lors de l'exécution d'un message de formulaire jquery, la fonction renvoie une URL à une action du contrôleur. Cela a bien fonctionné avec l'action du contrôleur de ramasser il s'agissait d'une requête ajax, puis rediriger une vue partielle pour mettre à jour la page. Cela fonctionne toujours bien dans Firefox, mais dans Internet Explorer, l'appel final à l'action du contrôleur vient maintenant du cache et retourne donc une vue complète plutôt que partielle.Problème de mise en cache ASP.NET MVC 2 RC

J'ai essayé de mettre le outputcache à 0 sans succès et j'ai aussi essayé le nocache actionfilter comme décrit ici Disable browser cache for entire ASP.NET website sans aucune chance. La seule façon dont je peux empêcher IE d'extraire du cache est de supprimer physiquement la version mise en cache.

N'importe qui a des idées (excuses si ce n'est pas très clair, difficile à expliquer!)?

Répondre

3

Pour une raison quelconque, IE est très agressif sur la mise en cache des GET AJAX. Donc, si vous allez chercher cela via AJAX, le comportement n'est pas surprenant pour moi. Il n'est pas surprenant non plus que l'utilisation de l'attribut de cache de sortie n'ait pas résolu le problème, car c'est IE, plutôt que le serveur, qui effectue la mise en cache. Ce que vous devez faire est de dire à IE de ne pas mettre en cache la requête, en définissant les en-têtes appropriés dans le HTTP. Voici comment nous le faisons:

[CacheControl(HttpCacheability.NoCache), HttpGet] 
    public JsonResult DoStuff() 
    { 
     //... 
    } 

public class CacheControlAttribute : ActionFilterAttribute 
{ 
    public CacheControlAttribute(HttpCacheability cacheability) 
    { 
     this._cacheability = cacheability; 
    } 

    private HttpCacheability _cacheability; 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(_cacheability); 
    } 
} 
+0

Merci pour cela, chose étrange est ce système fonctionnait bien avant de mettre à niveau vers la version candidate. J'ai implémenté votre attribut personnalisé mais j'ai toujours le même problème malheureusement. –

+0

Regardez de près (1) les en-têtes IE envoie et (2) les en-têtes dans votre réponse. Vous pouvez utiliser Fiddler pour cela. Si IE ne fait aucune demande, c'est certainement IE, pas le serveur, qui effectue la mise en cache, et vous devez créer les en-têtes dans le chargement de la page * initial * (celui auquel le serveur a effectivement répondu). t le cache. –

+0

J'ai ajouté le filtre nocache à l'ensemble du contrôleur et il l'attrape définitivement lors du chargement initial (vérifié via le point d'arrêt). La demande, comme vous le dites, n'est pas faite et vient du cache (d'après debugbar). J'ai ouvert ma boîte de dev sur http://cancharda.selfip.com:51331/Admin/Events à titre d'exemple, si vous cliquez sur l'icône en forme de crayon à côté de l'un ou l'autre événement, une boîte de dialogue s'ouvre, en cliquant sur le bouton Enregistrer le problème devient apparent. Merci pour votre aide, je pense que je deviens fou! :) –

0

Mes 2 cents à grande solution de Craig -

Si vous utilisez un contrôle utilisateur et le rendu à l'aide d'un "RenderAction"

<% Html.RenderAction("UserList", "User"); %> 

Et cette page l'appelle via GET ainsi que POST puis ne mentionne pas la méthode de requête dans la déclaration d'attribut. Par exemple, j'ai une grille de recherche et un panneau de recherche au-dessus de celui-ci. Par exemple, j'ai une grille de recherche et un panneau de recherche sur le dessus de celui-ci. J'ai fait de ma grille un contrôle utilisateur pour que je puisse invoquer le type & pagination via AJAX (GET) mais il est également appelé lorsque j'appuie sur le bouton "search" (POST) donc j'en ai besoin pour les deux.