2010-11-22 4 views
4

Je dois conserver une liste des ÉTATS d'utilisateurs enregistrés au niveau du serveur (soit «EN LIGNE» ou «HORS LIGNE»).MVC Vue partielle avec AutoRefresh

J'ai donc écrit une vue partielle pour maintenir l'état actuel de l'utilisateur (en ligne, hors ligne). Le serveur stocke ces valeurs sur la base de données et tous les utilisateurs en ligne actuels dans une entrée en cache afin que je puisse récupérer la liste de tous les utilisateurs "en ligne" actuels du cache.

Afin de maintenir cette liste à jour, j'ai maintenant besoin d'un appel AutoRefresh asynchrone qui notifie au serveur de garder mon ID utilisateur sur la liste en ligne. Cet appel devrait s'exécuter toutes les xx secondes et ne devrait être exécuté que si le statut actuel est ONLINE.

QUESTIONS:

  1. Comment puis-je créer un appel AutoRefresh qui se déclenche toutes les XX secondes
  2. Comment puis-je assurer cet appel exécute seulement quand je suis en état ONLINE

Merci à avance.


Ceci est la vue partielle en question. Où suggérez-vous que je mette le code pour exécuter AutoRefresh (MasterPage, Main View, Vue partielle) ???

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 

<% 
    if (MySite.Security.SiteUser.IsAuthenticated) 
    { 
     if (Convert.ToBoolean(ViewData["IsLogged"])) 
     { 
     %> 
      <div id="onlineStatus">     
       You are currently ONLINE >> 
       <%: Html.ActionLink("Take a Break", "GoOffline", "Account")%> 
      </div> 
     <% 
     } 
     else 
     { 
     %> 
      <div id="offlineStatus"> 
      Ready for business >> 
       <%: Html.ActionLink("Go Online", "GoOnline", "Account")%> 
      </div> 
     <% 
     } 
    } 
%> 
+1

Comment les utilisateurs se sont mis en ligne/hors ligne? – generalhenry

+0

Les utilisateurs cliquent sur le lien pour aller en ligne ou hors ligne. Ce dont j'ai besoin, c'est de pouvoir dire au serveur que l'utilisateur est toujours en ligne. C'est là que j'ai besoin de la fonction AutoRefresh toutes les XX secondes. –

Répondre

3

deux vous me mettre sur la bonne voie et la finale « de travail » réponse est:

<script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    $(document).ready(function() { 
     setInterval(function { 
         var url = '<%: Url.Action("StillOnline", "Account") %>'; 
         $.getJSON(url, null, function() { });} 
        , 10000); 
       }); 
</script> 
1

En utilisant javascript vous pouvez configurer une fonction qui le fait pour vous

setInterval(function() { 
    if (I_AM_ONLINE) { 
     window.location.reload(true); 
     //Or instead of refreshing the page you could make an ajax 
     //call and determing if a newer page exists. IF one does then reload. 
    } 
}, 300000); 

où 300,000 est le nombre de millisecondes entre chaque appel (5 minutes).

I_AM_ONLINE restent le plus dur et dépend de beaucoup de choses ....

EDIT:

Je voudrais ajouter ce code à l'intérieur lui-même partielle, (de préférence à la fin de celui-ci):

<% if (MySite.Security.SiteUser.IsAuthenticated) { 
     if (Convert.ToBoolean(ViewData["IsLogged"])) { %> 
      <script type="text/javascript"> 
      setInterval(window.location.reload(true), 300000); 
      </script> 
<% 
     } 
    } 
%> 
+0

Où placeriez-vous cet appel sur le PartialView ci-dessus? –

+0

e grazie per l'aiuto ... Filippo: -) –

+0

S'il vous plaît jeter un oeil à ma réponse modifier et ..... prego, figurati !!! :) – Lorenzo

1

voici quelques js avec un appel ajax et appels de fonctions récursives (asynchrone)

var onlineupdate; 
(onlineupdate = function() 
{ 
    if(online()) 
    { 
    $.post('serverside url', data, function(){ 
     setTimeout(onlineupdate,XX); 
    }); 
    } 
    else 
    { 
     setTimeout(onlineupdate,XX); 
    } 
})() 

encore la fonction pour déterminer ce qui compte comme en ligne doit être déterminée.

+0

Veuillez noter que 'setTimeout' ne s'exécutera qu'une seule fois alors que' setInterval' s'exécutera en continu ... – Lorenzo

+0

avec l'appel récursif, il fonctionnera en continu, et fonctionnera correctement même si vous définissez XX jusqu'à 1, il attendra toujours que le serveur réponde avant de répéter. – generalhenry

+0

Si c'est un appel récursif ... y a-t-il un nombre MAX d'itérations récursives qui peuvent se produire ?? –

Questions connexes