43 votes

MVC 3 - Html.EditorFor semble mettre en cache les anciennes valeurs après l'appel de $ .ajax

C'est un suivi à partir de la question suivante:

MVC 3 + $.ajax - réponse semble être la mise en cache de sortie de vue partielle

Il y a une description détaillée du problème là-bas. Cependant, j'ai maintenant réussi à cerner le problème, qui semble être avec le Html.EditorFor aides, d'où la nouvelle question.

Le problème:

- Je publier des données sur le serveur à l'aide de $.ajax, puis retour dans le code html de la vue partielle qui détient les commandes d'entrée. Le problème est que, malgré l'adoption d'un objet nouvellement créé à la Vue Partielle sur le modèle, les diverses @Html.EditorFor et @Html.DropDownListFor aides de retour à l'ANCIEN DONNÉES!.

Je peux prouver que le modèle est correctement passé dans un nouvel objet pour les assistants, par l'impression de la valeur à côté du helper Html. C'est à dire:

@Html.EditorFor(model => model.Transaction.TransactionDate) 
@Model.Transaction.TransactionDate.ToString()

Comme l'image ci-dessous montre, l' @Html.EditorFor est de retourner les données erronées:

Cached response...

[Notez que la valeur à côté de la Comentario zone de texte, une date, parce que j'ai été le tester en remplaçant les valeurs par défaut avec une valeur qui changerait à chaque post, c'est à dire, un DateTime.]

Si je remplace le @Html.EditorFor pour TransactionDate avec un simple vieux @Html.Zone de texte():

@Html.TextBox("Transaction_TransactionDate", Model.Transaction.TransactionDate)

Puis il rend le bon TransactionDate valeur pour un nouvel objet de la Transaction, c'est à dire, DateTime.MinValue (01/01/0001...).

Donc...

Le problème est avec le @Html.EditorFor aides. Le problème se produit également avec TextBoxFor et DropDownListFor.

Le problème étant que ces aides semblent cache l'ancienne valeur.

Ce que je fais mal??!

EDIT:

J'ai juste essayé de débogage dans l'Éditeur personnalisé de modèle pour les dates, et là, ViewData.TemplateInfo.FormattedModelValue montre la valeur correcte, c'est à dire, "01/01/0001". Cependant, une fois qu'il est à Fiddler, la réponse est montrant l'ancienne date, par exemple, "01/09/2011" dans l'image ci-dessus.

En conséquence, je pense juste qu'il y a de la mise en cache se passe ici, mais je n'en ai pas mis en place, donc rien ne fait aucun sens.

105voto

Darin Dimitrov Points 528142

Il n'y a pas de mise en cache impliqué ici. C'est juste comment HTML assistant fonctionne. Ils examinent d'abord le ModelState lorsqu'ils lient leurs valeurs, puis dans le modèle. Par conséquent, si vous envisagez de modifier les valeurs POSTed au sein de l'action de votre contrôleur, veillez à les supprimer de l'état du modèle:

 [HttpPost]
public virtual ActionResult AjaxCreate(Transaction transaction)
{
    if (ModelState.IsValid)
    {
        service.InsertOrUpdate(transaction);
        service.Save();
    }
    service.ChosenCostCentreId = transaction.IdCostCentre;
    TransactionViewModel viewModel = new TransactionViewModel();
    ModelState.Remove("Transaction");
    viewModel.Transaction = new Transaction();
    ModelState.Remove("CostCentre");
    viewModel.CostCentre = service.ChosenCostCentre;
    ...

    return PartialView("_Create", viewModel);
}
 

20voto

counsellorben Points 7865

Même si vous ne spécifiez pas de mise en cache, il peut parfois se produire. Pour ma contrôleurs de la poignée de l'AJAX et JSON demandes, je les décorer comme suit:

[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]

Cela concerne en particulier les déclare pas de mise en cache doit se produire.

Mise à JOUR

Basé sur une réponse Darin Dimitrov a donné ici, essayez d'ajouter la ligne suivante à votre contrôleur de l'action:

ModelState.Clear();

1voto

davethecoder Points 1878

je n'ai jamais vu cela, mais, fondamentalement, si vous êtes en utilisant ajax pour demander ces données, vous devez définir nochache: je suis en supposant que vous à l'aide de jQuery.ajax ici s'affiche le code:

$.ajax({
    url: "somecontroller/someAction,
    cache: false, // this is key to make sure JQUERY does not cache your request
    success: function( data ) {  
         alert( data );
    }
});

juste un coup de poignard dans le noir, je suppose que vous avez probablement déjà couvert ce déjà. avez-vous essayé de créer un nouveau modèle d'abord, puis de renseigner cette nouvelle instance du modèle avec des données, puis l'envoyer à votre vue!

Enfin pas sûr de ce serveur de base de données à l'aide de votre mais avez-vous vérifier que DB résultats ne sont pas mises en cache et que vous n'êtes pas juste de demander les résultats SQL à partir de la DB cache... que je n'utilise pas MsSQL mais j'ai entendu dire qu'il a outputCaching jusqu'à ce que quelque chose est à changer sur le serveur de base de données elle-même?? de toute façon, juste quelques pensées

0voto

Assurez-vous que vous ne faites pas ceci:

 @Html.EditorFor(model => model.Transaction.TransactionDate.Date)
 

Je l'ai fait, et le modèle n'a jamais récupéré la valeur. Cela a fonctionné parfaitement une fois que j'ai enlevé les .Date .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X