2009-08-28 14 views
8

En primer lugar mi código

$.getJSON("./posts/vote/" + postId + "/1", null, function(result) { 
    if (result.result == true) 
     $("#pst" + postId + " > .pstside > .rank > .score").html(result.voteCount); 
}); 

Tengo un montón de botones, cada uno con código que trae algunos resultados de la votación de una acción del controlador ASP.Net MVC.

Esto funciona bien la primera vez que se hace clic en el botón, pero si se vuelve a hacer clic no pasa nada. Nada llega al servidor.

Estoy haciendo pruebas en FireFox.

¿Qué está pasando? ¿Algún tipo de almacenamiento en caché extraño? Debido a que la solicitud nunca llega a mi controlador la segunda vez, el javascript parece ejecutarse bien, pero sigue devolviendo los valores anteriores.

+0

¿Has verificado firebug -> net? Puedes ver si la solicitud va al servidor y qué respuesta obtienes. –

Respuesta

18

suena como una cuestión de caché del navegador (si es que estoy bastante seguro de lo que está sucediendo con IE), es posible que desee utilizar $.ajax y establecer la opción de caché en false, ya que es false por defecto sólo para tipoDatos script y jsonp:

$.ajax({ 
    type: "GET", 
    url: "./posts/vote/" + postId + "/1", 
    success: function (result) { 
    if (result.result == true) 
     $("#pst" + postId + " > .pstside > .rank > .score").html(result.voteCount); 
    }, 
    dataType: "json", 
    cache: false 
}); 

O podría configurar esa opción a nivel mundial, para todas las funciones de jQuery Ajax, utilizando $.ajaxSetup antes de usar $ .getJSON:

$.ajaxSetup({ cache: false }); 

Editar: Usted puede hacer una petición POST volver JSON como esto:

$.post("./posts/vote/" + postId + "/1", 
    function (result) { 
    if (result.result == true) 
     $("#pst" + postId + " > .pstside > .rank > .score").html(result.voteCount); 
    }, "json"); 

Si va a hacer un montón de postJSON solicitud, puede hacer su propia función:

jQuery.postJSON = function(url, data, callback) { 
    jQuery.post(url, data, callback, "json") ; 
}; 

Y podrá usarlo igual que $ .getJSON

+0

Actualmente está sucediendo con Firefox 3.5. $ .ajaxSetup ({cache: false}); resuelto.Agregué un caché: verdadero al final de la solicitud, pero realmente me interesaba enviar una solicitud POST porque eso es lo que es. –

2

Dado que está haciendo un "GET", no parece irracional que el almacenamiento en caché (en el navegador, un proxy/intermediario o el servidor) podría ser el problema. Tal vez intente usar un "POST" si está cambiando los datos ("sigue devolviendo los valores anteriores"). O introduce algún componente aleatorio en la consulta.

+0

que suena como una idea razonable, déjame revisar cómo publicar con jquery getjson –

+0

Pude usar $ .post satisfactoriamente. –

0

Puede hacer lo mismo con la solicitud GET también, simplemente agregue una marca de tiempo al final de la solicitud, por ejemplo, vea la solicitud de muestra siguiente

http://www.abc.com/api/v1/votes?user=123&tag=jQuery&_TimeStamp = 1234421352

De esta manera el navegador no almacenar en caché sus peticiones nunca, ya que la URL cambiará en cada llamada. Puede obtener la marca de tiempo de Javascript fácilmente. Además, no necesita manejar esta marca de tiempo en su servidor, pero eso depende de usted.

+0

Bueno, esto es practicable, pero no práctico. Creo que hacer una solicitud POST fue la idea más razonable, pero en los escenarios donde POST no está disponible por alguna razón, podemos usar sus métodos o los de CMS. Gracias –

2

Sí, $.ajaxSetup({ cache: false }); resuelve el problema! Mi aplicación es con MVC 2. El código es el siguiente:

<script type="text/javascript"> 
    jQuery(document).ready(function() { 
     $.ajaxSetup({ cache: false }); 

     $('#btnApplyForm').click(function() { 
      $("#applyForm").html("Loading..."); 
      $("#divApplyForm").dialog("open"); 
      var id = $('#applyFormID').attr("value"); 
      $.get('<%= Url.Content("~/Applying/FillApplyForm/") %>' + id, 
        function (response) { $("#intakeForm").html(response); } 
      ); 
      return false; 
     }); 

     $("#divApplyForm").dialog({ 
      title: "Application Form", 
      autoOpen: false, 
      bgiframe: true, 
      modal: true, 
      width: 600, 
      height: 540 
     }); 
    }); 
</script> 
+0

¿Te importa si pregunto si esto se mantiene habilitado/deshabilitado solo dentro del alcance

Cuestiones relacionadas