2012-05-30 26 views
6

Tengo una aplicación MVC3 y necesito agregar una imagen de carga de ajax. Pongo esto en mi opiniónLoadingElementId en Ajax.BeginForm no muestra la imagen de carga

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

Ésta es mi muy simple div en el mismo punto de vista:

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

Cuando hago clic en mi botón de enviar para enviar el formulario de vuelta, el loading.gif nunca aparece. Mi código funciona bien, pero no aparece ningún indicador de carga. Y la imagen se nombra correctamente y en el lugar correcto. ¿Alguien tiene una pista de por qué?

Actualización Aparentemente, esto tiene algo que ver con las aplicaciones de Telerik. Si creo una aplicación regular de MVC3, funciona. Cuando creo una aplicación Telerik MVC3, no funciona. ¿Alguien más se ha encontrado con esto con Telerik?

+0

¿Ha intentado depurarlo con firebug? ¿Recibes algún error en tu consola? –

Respuesta

6

Prefiero evitar una carga iamge a cada llamada ajax que hago.

La respuesta más común aquí es una solución para mostrar una (la carga de imágenes) spinner ajax ajax cada vez que hace una llamada de envío:

Display spinner while waiting For ajax

Tiene la funcionalidad que necesita. Simplemente use javascript para adjuntar la visualización de la imagen a las llamadas ajax.

Debería ser algo como:

<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> 

Lo que esto hace es mostrar el div en el Ajax de envío y lo oculta tras parada ajax o error para todas las llamadas en su página. Si coloca este script y div en su _layout, lo hará por cada llamada de Ajax en su sitio.

+0

Gracias por responder. Agregué esto a mi _Layout.cshtml y todavía no vi el cargador. ¿Es ajaxSend un método que necesito crear? – BoundForGlory

+0

Parece obvio, pero ¿está cargada la imagen en su proyecto? Intente configurar el texto alternativo en algo para asegurarse de que se muestre div. Ah, y asegúrate de que tu div esté en el _layout también. – Totero

+0

Sí, está allí. Si elimino style = "display: none" y actualizo, aparece el gif. Confía en mí, miré eso primero. – BoundForGlory

1

Es posible que desee probar esto en su lugar. Me lo dio el SO cuestionar here

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

Intenté eso con mis dedos cruzados, no funcionó :(configuré un proyecto de muestra, y funciona. Lo muevo a mi proyecto principal y no funciona. Pero esto parece tan simple. He escondido y mostrado objetos antes de – BoundForGlory

+0

cualquier posibilidad ¿su GIF de carga no se está copiando en su directorio de salida?¿La Acción de compilación está configurada en Contenido y Copiar en salida establecida en Copiar siempre/Copiar si es más reciente? –

+0

no importa, solo lea el comentario de la respuesta de Totero –

14

Usted podría intentar esto así de: 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

Creo que OnBegin podría ser el camino a seguir, pero no está llamando a mi método AjaxBegin. Lo hago como nuevas AjaxOptions {OnBegin = "return AjaxBegin()"}) – BoundForGlory

+0

AjaxOptions Events toma una cadena de javascript o un nombre de función de JavaScript, por lo que debería funcionar siempre que tu función AjaxBegin esté en el espacio de nombres global. ¿Funciona si vas: nuevas AjaxOptions {OnBegin = "AjaxBegin"} –

+0

@ user1202717 Oye, solo quería hacer un seguimiento y ver si esto funcionó para ti? –

0

que tenía el mismo problema y fue capaz de resolverlo cambiando el nombre del elemento que se va oculto/mostrado. Utilicé el formato camel-case: "myDivToBeHidden"

El elemento necesita la propiedad "mostrar" establecida en "ninguna".

Cuestiones relacionadas