2009-08-18 6 views
0

- L'exécution dans ASP.NET MVC à côté jQuery -Un rendu partiel peut-il être rendu sans publication?

J'utilise jQuery pour rendre un bloc <LI> comme une liste d'éléments de menu déroulant. Il y a 3 items dans cette liste si l'utilisateur n'est pas connecté - 4 items s'il s'est connecté. Ce 4ème item doit exécuter quelques conditions avant de pouvoir décider exactement quelle charge il transporte donc j'ai ce code dans un fichier .ascx contrôle et les appels de la page principale:

<div id="loginBox"> 
    <% Html.RenderPartial("showLoginStatus"); %> 
</div> 

afin de décider comment le rendre. Cela fonctionne autant que je suis prêt à attendre une publication qui suit la connexion basée sur AJAX. Ce que je dois faire maintenant, c'est que le code s'exécute sans l'actualisation de la page.

La partie de la page qui affiche soit le bouton de connexion ou le nom de l'utilisateur ressemble à:

var form = $("#loginForm"); 
    form.submit(function() { 
     var data = form.serialize(); 
     $.post(form.attr("action"), data, function(result, status) { 
      if (result.Success) { 
       $(".showLoggedUser").html(result.UserName + '<br /><a href="/Admin/Account/LogOut">Log Out</a>'); 
       //how can I force the code contained in 'showLoginStatus.ascx' to render at this point? 
       api.close(); 
      } else { 
       $('.loginErrors').html(result.ErrorMessage); 
      } 
     }, "json"); 
     return false; 
    }); 
}); 
+0

Avez-vous envisagé d'utiliser un panneau de mise à jour? Bien que les panneaux de mise à jour soient connus pour être "lents", utilisez firebug pour voir combien de données sont réellement affichées. Il peut être petit mais il devrait vous faire gagner beaucoup de place et garder le cycle de vie de la page en échec –

Répondre

1

Vous pouvez renvoyer le code HTML de ShowLoginStatus.ascx dans le résultat (JSON probablement).
Here est comment vous pouvez rendre la vue en chaîne pour accompagner cela.

Une autre approche consiste à renvoyer différents types de contenu de l'action en fonction du résultat.

  1. L'utilisateur entre ses informations d'identification et clique sur Se connecter.
  2. serveur vérifie les et:
    1. Si elle est correcte - rend vue partielle (de sorte que le résultat est HTML).
    2. Si non - rend JSON avec la description d'erreur, etc.
  3. Sur le client - si le contenu est HTML - mis alors à Whereever il est nécessaire.
  4. Si le contenu est JSON - afficher les erreurs à l'utilisateur et anaylyse le résultat.

donc votre JavaScript ressemblera:

var form = $("#loginForm"); 
form.submit(function() { 
    var data = form.serialize(); 
    $.post(form.attr("action"), data, function(result, status) { 
     // Write your isJson function to check the result type 
     if (!isJson(result)) { 
      $(".showLoggedUser").html(result); 
      api.close(); 
     } else { 
      $('.loginErrors').html(result.ErrorMessage); 
     } 
    }); // DO NOT SPECIFY RESULT TYPE 
    return false; 
}); 

});

0

Qu'en est-il si la demande ajax était de retourner une vue partielle qui comprenait le contenu showLoginStatus?

Avoir une action que l'ajax appelle qui renvoie une vue partielle (.ascx) et cette vue partielle est composée de la vue showLoginStatus et de toute balise supplémentaire dont vous avez besoin. Peut-être jeter un oeil à Ajax.ActionLink et le paramètre AjaxOptions pour obtenir d'autres idées?