2012-05-30 6 views
6

Ho un'app MVC3 e ho bisogno di aggiungere un'immagine di caricamento Ajax. Ho messo questo sul mio punto di vistaLoadingElementId in Ajax.BeginForm non visualizza l'immagine di caricamento

@using (Ajax.BeginForm(
     "LogOn","Account", 
     new AjaxOptions { LoadingElementId = "div_loading" })) 

Questo è il mio molto semplice div sulla stessa vista:

<div id="div_loading" style="display:none;"> 
    <img src="@Url.Content("~/Content/Images/loading.gif")" alt="" /> 
</div> 

Quando clicco il mio pulsante di invio per inviare il modulo di schiena, il loading.gif non appare mai. Il mio codice funziona bene, ma non viene visualizzato alcun indicatore di caricamento. E l'immagine è nominata correttamente e nel posto giusto. Qualcuno ha un indizio perché?

Aggiornamento Apparentemente, questo ha qualcosa a che fare con le applicazioni Telerik. Se creo una normale app MVC3, funziona. Quando creo un'app Telerik MVC3, non funziona. Qualcun altro l'ha incontrato con Telerik?

+0

hai provato a debuggarlo con firebug? Hai errori nella tua console? –

risposta

6

Preferisco evitare di allegare un errore di caricamento a ogni chiamata Ajax che faccio.

La risposta superiore Ecco una soluzione per visualizzare una filatrice ajax (loading image) ogni volta ajax effettua una chiamata di invio:

Display spinner while waiting For ajax

Ha la funzionalità necessaria. Basta usare javascript per collegare il display dell'immagine alle chiamate Ajax.

Dovrebbe essere qualcosa del tipo:

<script type="text/javascript"> 
     $(document).ready(function() { 
      BindSpinner(); 
     }); 

     function BindSpinner() { 
      $("#div_loading").bind("ajaxSend", function() { 
       $(this).show(); 
      }).bind("ajaxStop", function() { 
       $(this).hide(); 
      }).bind("ajaxError", function() { 
       $(this).hide(); 
      }); 
     }; 
    </script> 

Quello che fa è visualizzare il div su ajax invio e nasconde su di arresto ajax o di errore per tutte le chiamate sulla tua pagina. Se metti questo script e il div nel tuo _layout lo farà per ogni chiamata Ajax sul tuo sito.

+0

Grazie per la risposta. Ho aggiunto questo al mio _Layout.cshtml e non ho ancora visto il loader. AjaxInvia un metodo che ho bisogno di creare? – BoundForGlory

+0

Sembra ovvio, ma l'immagine è stata caricata nel tuo progetto? Prova a impostare il testo alternativo su qualcosa per assicurarti che il div sia visualizzato. Oh e assicurati che anche il tuo div sia nello _layout. – Totero

+0

Sì, è lì. Se rimuovo style = "display: none" e aggiorno, la gif appare. Fidati di me, l'ho guardato prima. – BoundForGlory

1

Si potrebbe voler provare questo invece. Ho preso dalla domanda SO here

<div id="div_loading" style="visibility:hidden;"> 
    <img src="@Url.Content("~/Content/Images/loading.gif")" alt="" /> 
</div> 
+0

Ho provato questo con le dita incrociate, non ha funzionato :(Ho impostato un progetto di esempio, e funziona.Mi trasferisco nel mio progetto principale e non lo fa.Ma sembra così semplice.Ive ha nascosto e visualizzato gli oggetti prima di – BoundForGlory

+0

qualsiasi possibilità la tua gif di caricamento non viene copiata nella directory di output?L'azione Build è impostata su Content e Copy To Output su Copy Always/Copy If Newer? –

+0

non importa, basta leggere il commento dalla risposta di Totero –

14

Si potrebbe provare questo così da: here

function AjaxBegin() 
{ 
    $('#div_loading').show(); 

} 
function AjaxComplete() 
{ 
    $("#div_loading").hide(); 
} 
function AjaxFailure(ajaxContext) 
{ 
    var response = ajaxContext.responseText; 
    alert("Error Code [" + ajaxContext.ErrorCode + "] " + response); 
} 


AjaxOptions: 

OnFailure = "AjaxFailure"; 
OnBegin = "AjaxBegin"; 
OnComplete = "AjaxComplete"; 
+0

Penso che l'OnBegin potrebbe essere la strada da percorrere, ma non chiama il mio metodo AjaxBegin. Mi piace così nuovo AjaxOptions {OnBegin = "return AjaxBegin()"}) – BoundForGlory

+0

AjaxOptions Gli eventi accettano una stringa javascript o un nome di funzione javascript, quindi dovrebbe funzionare finché la funzione AjaxBegin si trova nello spazio dei nomi globale. Funziona se si va: nuovo AjaxOptions {OnBegin = "AjaxBegin"} –

+0

@ user1202717 Ehi, volevo solo seguire e vedere se questo ha funzionato per te? –

0

Ho avuto lo stesso problema e sono riuscito a risolverlo cambiando il nome dell'elemento di essere nascosto/mostrato. Ho usato il formato Camel Case: "myDivToBeHidden"

L'elemento necessita della proprietà "display" impostata su "none".

Problemi correlati