2010-11-22 10 views
4

ログオンしたユーザーのステータスをサーバーレベル(「オンライン」または「オフライン」のいずれか)にしておく必要があります。自動更新機能付きMVCパーシャルビュー

私はユーザーの現在のステータス(オンライン、オフライン)を維持するために部分ビューを作成しました。 サーバーはこれらの値をデータベースと現在のすべてのオンラインユーザーの両方にキャッシュエントリにも格納し、キャッシュから現在のすべての「オンライン」ユーザーの一覧を取得できるようにします。

このリストを最新の状態に保つために、サーバーに自分のuserIDをONLINEリストに保存するように通知する非同期AutoRefresh呼び出しが必要になります。この呼び出しはxx秒ごとに実行され、現在のステータスがONLINEの場合にのみ実行されます。

質問:私は

  • どのように私はこの呼び出しを確保することができます実行だけで私はONLINE状態にいる
  • のおかげですべてのXX秒を発射する自動更新の呼び出しを作成するにはどうすればよい

    1. 前進。


      これは問題のパーシャルビューです。 AutoRefresh(マスターページ、メインビュー、パーシャルビュー)を実行するコードはどこに置くことをお勧めしますか?

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

    ユーザーが自分自身を設定しない方法は、オンライン/オフラインになっていますか? – generalhenry

    +0

    リンクをクリックするとオンラインまたはオフラインになります。私が必要とするのは、ユーザーがまだオンラインであることをサーバーに伝えることです。 これは、XX秒ごとに自動リフレッシュ機能が必要な場所です。 –

    答えて

    3

    あなたの両方が正しい方向に私を入れて、最終的な「作業」答えは次のとおりです。

    <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

    セットアップのためにそれをしない機能をすることができますJavaScriptを使用して、あなた300.000は各コール(5分)間のミリ秒数がある

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

    。私は(好ましくはそれの終わりに)、部分自体の内部にこのコードを追加します

    I_AM_ONLINEは

    EDIT ....最も困難な部分を維持し、多くのものに依存し

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

    上記のPartialViewにこの呼び出しをどこに入れますか? –

    +0

    e grazie per l'aiuto ...フィリッポ: - ) –

    +0

    私の答えを見て編集してください..... .....プレゴ、figurati! :) – Lorenzo

    1

    ここAJAX呼び出しと再帰関数の呼び出し(非同期)

    var onlineupdate; 
    (onlineupdate = function() 
    { 
        if(online()) 
        { 
        $.post('serverside url', data, function(){ 
         setTimeout(onlineupdate,XX); 
        }); 
        } 
        else 
        { 
         setTimeout(onlineupdate,XX); 
        } 
    })() 
    
    といくつかのjsです

    もう一度、オンラインとみなされるものを決定する機能を決定する必要があります。

    +0

    'setTimeout'は' setInterval'が連続して実行されている間に一度だけ実行されることに注意してください... – Lorenzo

    +0

    再帰呼び出しでは連続して実行され、 XXを1に設定すると、サーバーが繰り返し応答するまで待機します。 – generalhenry

    +0

    これは再帰的呼び出しです...発生した可能性のある再帰的反復の数がMAXですか? –

    関連する問題