Частичное представление вызова метода на сервере каждые 5 секунд - никаких изменений не требуется на самой странице - PullRequest
2 голосов
/ 26 марта 2011

У меня есть простое частичное представление, которое я хотел бы автоматически вызывать на сервере каждые 5 секунд.

Загрузка частичного вида из мастер-макета:

@{Html.RenderAction("PingServer", "Account"); }

Контроллер выглядит так:

public ActionResult PingServer()
{
     return PartialView("PingServer");
}

Фактическое частичное представление "_PingServer":

@{
    <script language="javascript" type="text/javascript"
                 src="http://code.jquery.com/jquery-latest.js">
    </script>
    <script language="javascript" type="text/javascript">
        $(function () {
            setInterval(Foo, 5000);
        });

        function Foo() {
            $.post("/Shared/ImHere.ashx", null, function () { });
        }    
    </script>
}

Фактический "ImHere.ashx.cs" выглядит так:

public class ImHere : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
         SiteUser.ImHere();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

======================

ЭТО ПРОСТО НЕ РАБОТАЕТ.

На самом деле он работал на MVC2, но больше на MVC3. Я понимаю, что способ обработки частичных представлений в MVC3 теперь немного отличается от этого понятия «_» (подчеркивание), и я не уверен, что это проблема. Я попытался переименовать это частичное представление _PingServer… но все равно НЕТ эффекта.

Может быть, я загружаю частичное представление как Html.RenderAction вместо Html.RenderPartial?

Идея состоит в том, что этот вызов должен выполняться каждые 5 секунд, а не менять одну вещь на странице.

Есть мысли ??

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Вам не нужно использовать RenderAction, вы можете просто использовать

@Html.Partial('partialName')

для визуализации частичного представления. Использование этого устраняет необходимость в методе действия PingServer().

Также ваше частичное представление не должно быть в пределах @ { } просто

<script language="javascript" type="text/javascript"
             src="http://code.jquery.com/jquery-latest.js">
</script>
<script language="javascript" type="text/javascript">
    $(function () {
        setInterval(Foo, 5000);
    });

    function Foo() {
        $.post("/Shared/ImHere.ashx", null, function () { });
    }    
</script>

как это просто HTML

0 голосов
/ 27 марта 2011

Давид, Ваш последний комментарий помог мне найти проблему.

КОММЕНТАРИЙ: Вы также можете подтвердить, что ваш обработчик ImHere работает независимо от всего этого процесса, например, путем прямого перехода к URL-адресу

ПРОБЛЕМА: СБОЙ НА ИМЕННОМ ПРОСТРАНСТВЕ

Когда я добавил НОВЫЙ файл в проект типа AHXS, Visual Studio по умолчанию дал ему пространство имен "ProjectName.DLLName.Folder" как для части HTML, так и для CS.

Я переименовал пространство имен CS в другое имя (например, ProjectName.Folder), но Visual Studio не пожаловалась на это при компиляции.

Оооо ... такая ошибка новичка !!
В любом случае, спасибо всем за помощь.

0 голосов
/ 26 марта 2011

В вашей функции Foo javascript вы вызываете обработчик /Shared/ImHere.ashx, поэтому не следует ожидать, что действие /Account/PingServer будет выполнено во время вызова AJAX.Это будет выполнено только во время начальной загрузки страницы.

Основной макет:

@{Html.RenderAction("PingServer", "Account"); }

Контроллер:

public class AccountController: Controller
{
    public ActionResult PingServer()
    {
        return PartialView();
    }
}

Соответствующий частичный (~/Views/Account/PingServer.cshtml).Обратите внимание на удаление блоков @{}, поскольку они не нужны, а также использование помощника Url для создания URL-адреса сценария сервера, чтобы избежать его жесткого кодирования, которое может сломаться, если ваше приложение размещено в виртуальном каталоге внутри IIS:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
    $(function () {
        setInterval(Foo, 5000);
    });

    function Foo() {
        // here you are posting to an ASHX handler so don't expect
        // the controller action to ever be hit
        $.post('@Url.Content("~/Shared/ImHere.ashx")', null, function (result) { 
            // do something with the result of the AJAX call like update
            // some part of the DOM
        });
    }    
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...