Частичное представление MVC с автообновлением - PullRequest
4 голосов
/ 23 ноября 2010

Мне нужно вести список зарегистрированных пользователей СТАТУСЫ на уровне сервера («ONLINE» или «OFFLINE»).

Поэтому я написал частичное представление для поддержания текущего статуса пользователя (онлайн, автономно)).Сервер хранит эти значения как в базе данных, так и во всех текущих пользователях в сети, а также в записи в кэше, чтобы я мог получить список всех текущих пользователей в сети из кэша.

Для того, чтобы поддерживать этот список в актуальном состоянииТеперь мне нужен асинхронный вызов AutoRefresh, который уведомляет сервер о необходимости сохранения моего userID в списке ONLINE.Этот вызов должен выполняться каждые XX секунд и должен выполняться только в том случае, если текущее состояние ONLINE.

ВОПРОСЫ:

  1. Как создать вызов AutoRefresh, который срабатывает каждые XX секунд
  2. Как я могу убедиться, что этот вызов выполняется только тогда, когда я нахожусь в состоянии ONLINE

Заранее спасибо.


Это частичное представление, о котором идет речь.Куда вы предлагаете поместить код для запуска автообновления (MasterPage, Main View, Partial View) ???

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

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Вы оба направили меня в правильном направлении, и окончательный «рабочий» ответ:

<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 голос
/ 23 ноября 2010

вот некоторые js с ajax-вызовом и рекурсивными вызовами функций (асинхронные)

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

снова должна быть определена функция для определения того, что считать онлайн.

1 голос
/ 23 ноября 2010

Используя javascript, вы можете настроить функцию, которая сделает это за вас

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

, где 300.000 - это количество миллисекунд между каждым вызовом (5 минут).

I_AM_ONLINE остается самой сложной частьюи зависит от многих вещей ....

РЕДАКТИРОВАТЬ :

Я бы добавил этот код внутри самого частичного (предпочтительно в конце):

<%  if (MySite.Security.SiteUser.IsAuthenticated) {
        if (Convert.ToBoolean(ViewData["IsLogged"])) { %>
            <script type="text/javascript">
            setInterval( window.location.reload(true), 300000);
            </script>
<%
        }
    }
%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...