2011-03-09 2 views
4

J'utilise des modèles de l'éditeur avec une page maître personnalisée afin quemodèles éditeur mvc résultat est mis en cache

Html.EditorFor(o => o.Name) 

génère une étiquette et une entrée, j'utilise également un attribut DisplayName personnalisé pour localiser les étiquettes

[DisplayNameLocalized("Name")] 
public string Name {get;set;} 

J'ai mis un point d'arrêt dans le constructeur de l'attribut et j'ai remarqué qu'il est appelé seulement la première fois que je rends la page avec le EditorFor, donc je suppose que le résultat de editorfor est mis en cache, quelqu'un sait comment éviter cette mise en cache ?

Répondre

2

J'ai rencontré le même problème. Cela fonctionne pour moi

public ActionResult Index(int? pageNumber) 
     { 
      var wishlistModel = new WishlistModel(); 
      BindGifts(wishlistModel, pageNumber); 
      if (Request.IsAjaxRequest()) 
      { 
       ViewData.ModelState.Clear(); 
       return PartialView("_UserGiftList", wishlistModel); 
      } 

      return View(wishlistModel); 
     } 

Après quelques recherches dans les sources MVC j'ai trouvé que tous les assistants Html obtenir des données de l'objet ViewData.ModelState et sur des raisons inconnues ModelState mises en cache après ajax demande.

4

Idéalement, vous devez utiliser l'attribut [NoCache] dans l'action.

public class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 

     base.OnResultExecuting(filterContext); 
    } 
} 

Il est également possible d'utiliser <%@ OutputCache %> directive dans le modèle - mais certains se plaignent que ça ne fonctionne pas toujours.

Pour référence, voir here.

Vous pouvez utiliser <%@ OutputCache NoStore="true" %>

+0

@Aliostad ça n'aide pas, j'ai essayé aussi des aides simples comme @ Html.LabelFor, @ Html.ValidationMessageFor, ils sont tous mis en cache – Omu

+0

Vous avez essayé l'attribut [NoCache] ?? – Aliostad

+0

@Aliostad oui essayé, aussi ma demande est une requête ajax (la réponse ajax n'est pas mis en cache), au cas où cela compte – Omu

0

J'ai rencontré un problème similaire lors du déploiement sur un site Web Azure. Une ancienne version d'un EditorTemplate était systématiquement affichée. J'ai essayé manuellement la publication du fichier cshtml, j'ai essayé de FTP sur le site et de supprimer à la fois le dossier Views et le dossier Bin; mais toujours ce fantôme d'un EditorTemplate hantait le site!

Ce qui a finalement travaillé vérifiait la Supprimer les fichiers supplémentaires à l'option destination sous build> Publier> Paramètres> Fichier Options de publication.

Questions connexes