2009-02-23 5 views
19

SHORT:
Comment faire pour qu'un contrôleur retourne la vue en cours ou simplement ne fasse rien?COMMENT? Contrôleur renvoyer rien/affichage en cours

LONGUE:
J'ai une vue partielle où j'ai créé un imagelider. Il contient un lien qui envoie une requête à un contrôleur pour obtenir l'image suivante (en utilisant ajax). Le contrôleur récupère l'image suivante, la stocke dans ViewData et renvoie une vue partielle (celle ci-dessus). Maintenant, ce que je fais aujourd'hui est que quand le contrôleur atteint la dernière image, il retourne la même image (en la récupérant), mais crée quand même une nouvelle vue, c'est-à-dire que le client/navigateur réexamine les "mêmes" données.
Cela semble quelque peu non-optimal.

Ce que je voudrais faire, c'est que lorsque le contrôleur atteint la dernière image, il devrait simplement ne rien faire.
Si je renvoie null, la vue est mise à jour avec des contenus vides.
Je veux que la vue/client/navigateur conserve tout ce qu'il a et le contrôleur pour ne rien faire.

[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

Tout comme ce que je cherche, mais pas encore de réponse. Le dessous est une page rafraîchissante, que je n'aime même pas. comme mon javascript/jquery a mis à jour l'interface utilisateur et il n'y a rien du côté serveur pour mettre à jour sur l'interface utilisateur qui attend juste un indicateur pour voir si mon contrôleur réussit à exécuter une tâche ou non. Si oui, je mets à jour l'interface utilisateur avec javascript/jquery, sinon encore mettre à jour certaine chose (comme une coche) avec seulement. Tout le reste du contenu de la page J'aime rester tel quel sans effet de rafraîchissement qui tue les modifications javascript pour les actions de l'utilisateur. Les ci-dessous ans. ne fonctionne pas car il renvoie une vue vide. – AKS

Répondre

24

Vous pouvez retourner un EmptyResult si vous voulez ne rien faire ...

return new EmptyResult(); 

Si vous utilisez AjaxHelper vous pouvez éviter la mise à jour en fournissant un code d'état échoue (par exemple 404 ou tout ce qui est le plus approprié), qui va l'arrêter le remplacement de votre div comme javascript MicrosoftMvcAjax.js vérifie explicitement une réponse avant la mise à jour réussie des éléments: -

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

en fin de compte la meilleure façon de l'éviter est de concevoir la vue partielle afin d'éviter le problème (comme vous le dites vous-même).

+2

Eh bien actully ça fait quelque chose, ça renvoie un résultat vide. Identique à la valeur null. Ceci affiche simplement le contenu vide. Ce n'est pas ce que je veux qu'il fasse. Je le veux pour .. hmm .. ne rien faire, renflouer, laisser la vue actuelle telle quelle. Aucune mise à jour. :) –

+0

Eh bien, vous l'appelez via AJAX, donc il doit recevoir une réponse de la XMLHttpRequest? Vérifiez simplement la longueur du résultat dans le rappel de succès et s'il est supérieur à 0, remplacez le contenu par votre nouveau fragment HTML sinon laissez-le tel quel. –

+0

J'utilise le "built-in" ajax: <% = Ajax.ActionLink ("Suivant", "GetNextImage", "Image", nouveau {...}, nouveau AjaxOptions {InsertionMode = InsertionMode.Replace, UpdateTargetId = "ImageDiv"})%> Espérait une solution simple sans avoir besoin de javascript, etc. –

0

En supposant que vous utilisez MicrosoftMvcAjax, vous pouvez renvoyer un JavascriptResult qui avertit l'utilisateur qu'il a atteint la fin du curseur. Si la réponse est javascript plutôt que le contenu, le gestionnaire MicrosoftMvcAjax l'exécute au lieu de remplacer le contenu 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"); 
} 

Bien sûr, vous auriez probablement envie d'être plus créatif et utiliser le plugin jQuery dialogue ou quelque chose plutôt que d'une alerte.

+0

'return JavaScript (" alert ('No more images'); ");' aboutit à ma vue changeant en texte clair disant 'alerte (' Plus d'images '); ' – Mans

0

Ok, je l'ai.
Pas une solution à ma question, mais résout toujours le problème.

Je ne montrerai simplement pas le lien "Suivant" quand la vue montre la dernière image.

ne peux pas croire que je ne pensais pas plus tôt ...

Merci pour vos efforts gars

Questions connexes