2009-02-23 30 views
19

CORTO:
¿Cómo hago un controlador de devolver la vista actual o simplemente no hacer nada?¿CÓMO? Controlador de retorno nada/vista actual

LARGO:
Tengo una vista parcial donde he creado un deslizador de imágenes. Contiene un enlace que envía una solicitud a un controlador para obtener la siguiente imagen (utilizando ajax). El controlador busca la siguiente imagen, la almacena en ViewData y devuelve una vista parcial (la de arriba).

Ahora, lo que hago hoy es que cuando el controlador llega a la última imagen, vuelve a devolver la misma imagen (volviéndola a poner), pero aún crea una nueva vista, es decir, el cliente/navegador vuelve a analizar los "mismos" datos.
Esto parece algo no óptimo.

Lo que me gustaría hacer es que cuando el controlador llegue a la última imagen, simplemente no haga nada.
Si devuelvo nulo, la vista se actualiza con contenido vacío.
Quiero que la vista/cliente/navegador retenga lo que tenga y el controlador simplemente no haga nada.

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult GetNextImage(...) 
    { 
     if(Request.IsAjaxRequest()) 
     { 
      if(CURRENT_IMAGE != LAST_IMAGE) 
      { 
       Image image = GetNextImage(...); 
       var partialViewResult = new PartialViewResult(); 
       partialViewResult.ViewName = "ImageSlide"; 
       partialViewResult.ViewData.Model = image; 
       return partialViewResult; 
      } 
      else 
      { 
       // DO NOTHING, HOW? 
      } 
     } 

     return RedirectToAction("Error", "Home"); 
    } 
+0

Al igual que lo que estoy buscando, pero ninguna respuesta todavía. La siguiente es una página refrescante, que ni siquiera me gusta. como mi javascript/jquery actualizó la interfaz de usuario y no hay nada del lado del servidor para actualizar en la interfaz de usuario que solo espera que un indicador vea si mi controlador tiene éxito en la ejecución de alguna tarea o no. en caso afirmativo, actualizo la interfaz de usuario con javascript/jquery; si no, vuelva a actualizar solo ciertas cosas (como una marca de verificación). El resto del contenido de la página me gusta permanecer como estaba sin efecto de actualización que mata los cambios de JavaScript para las acciones del usuario. Los siguientes ans. no funciona ya que devuelve una vista en blanco. – AKS

Respuesta

24

Puede devolver un EmptyResult si usted quiere que haga nada ...

return new EmptyResult(); 

Si está utilizando el AjaxHelper puede evitar la actualización mediante el suministro de un código de estado fallido (por ejemplo, 404 o lo que sea más apropiado), que va a dejar de que la sustitución de su div como el Javascript en MicrosoftMvcAjax.js comprueba explícitamente una respuesta exitosa antes de actualizar los elementos: -

this.ControllerContext.HttpContext.Response.StatusCode = 404; 
return new EmptyResult(); 

en última instancia la mejor manera de evitarlo es diseñar la vista parcial para evitar el problema en primer lugar (como usted se menciona a sí mismo).

+2

Bueno, en realidad hace algo, devuelve un resultado vacío. Igual que devolver nulo. Esto simplemente muestra contenido vacío. Eso no es lo que quiero que haga. Quiero que ... hmm ... no haga nada, rescatar, dejar la vista actual tal como está. Sin actualización. :) –

+0

Bueno, ¿lo está llamando a través de AJAX por lo que tiene que recibir una respuesta de XMLHttpRequest? Simplemente verifique la longitud del resultado en la devolución de llamada exitosa y, si es mayor que 0, reemplace el contenido con su nuevo fragmento de HTML, de lo contrario, déjelo tal como está. –

+0

Estoy usando el ajax "incorporado": <% = Ajax.ActionLink ("Siguiente", "GetNextImage", "Imagen", nuevo {...}, nuevas AjaxOptions {InsertionMode = InsertionMode.Replace, UpdateTargetId = "ImageDiv"})%> Estaba esperando una solución simple sin necesidad de arenosas javascripting, etc. –

0

Suponiendo que está utilizando MicrosoftMvcAjax, puede enviar de vuelta un JavascriptResult que alerta al usuario de que ha llegado al final de la barra deslizante. Si la respuesta es javascript en lugar de contenido, el controlador MicrosoftMvcAjax lo ejecuta en lugar de reemplazar el contenido DOM.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult GetNextImage(...) 
{ 
    if(Request.IsAjaxRequest()) 
    { 
     if(CURRENT_IMAGE != LAST_IMAGE) 
     { 
      Image image = GetNextImage(...); 
      var partialViewResult = new PartialViewResult(); 
      partialViewResult.ViewName = "ImageSlide"; 
      partialViewResult.ViewData.Model = image; 
      return partialViewResult; 
     } 
     else 
     { 
      return JavaScript("alert('No more images');"); 
     } 
    } 

    return RedirectToAction("Error", "Home"); 
} 

Por supuesto, usted probablemente querrá ser más creativos y utilizar el plugin o algo de diálogo jQuery en lugar de una alerta.

+0

'return JavaScript (" alert ('No more images'); ");' da como resultado que mi vista cambie a texto sin formato diciendo 'alerta ('No más imágenes');' – Mans

0

Ok, lo tengo.
No es una solución a mi pregunta, pero aún resuelve el problema.

Simplemente no mostraré el enlace "Siguiente" cuando la vista muestre la última imagen.

No se puede creer que no pienso en ello antes ...

Gracias por sus esfuerzos chicos

Cuestiones relacionadas