"UpdatePanel" в Razor (mvc 3)

Есть ли что-то вроде UpdatePanel (в ASPX) для Razor?

Я хочу обновлять данные (например, таблицы, диаграммы,...) автоматически каждые 30 секунд. Аналогично нажатию на следующую ссылку каждые 30 секунд:

 @Ajax.ActionLink("Refresh", "RefreshItems", new AjaxOptions() {
     UpdateTargetId = "ItemList",
     HttpMethod = "Post"})

Редактировать:

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

Код в cshtml:

<div id="ItemList">
  @Html.Partial("_ItemList", Model)
</div>

Код в контроллере:

    [HttpPost]
    public ActionResult RefreshItems() {
        try {
            // Fill List/Model
            ... 

            // Return Partial
            return PartialView("_ItemList", model);
        }
        catch (Exception ex) {

            return RedirectToAction("Index");
        }
    }

Было бы создать, если PartielView может обновить себя.

Ответ 1

Вы можете попробовать что-то похожее на следующее, используя JQuery (не тестировалось)

<script type="text/javascript">
   $(document).ready(function() {
        setInterval(function()
        {
         // not sure what the controller name is
          $.post('<%= Url.Action("Refresh", "RefreshItems") %>', function(data) {
           // Update the ItemList html element
           $('#ItemList').html(data);
          });
        }
        , 30000);
   });
</script>

Вышеприведенный код должен быть помещен на содержащую страницу, а не на страницу частичного просмотра. Имейте в виду, что частичный вид не является полной html-страницей.

Моя первоначальная догадка заключается в том, что этот script может быть помещен в частичный и изменен следующим образом. Убедитесь, что для типа данных ajax установлено значение html.

<script type="text/javascript">
    setInterval(function()
    {
      // not sure what the controller name is
      $.post('<%= Url.Action("Refresh", "RefreshItems") %>', function(data) {
        // Update the ItemList html element
        $('#ItemList').html(data);
      });
    }
    , 30000);
</script>

Другой альтернативой является сохранение javascript в отдельном файле js и использование функции Jquery getScript в обратном вызове ajax.

Ответ 2

Если кто-то хочет получить полный код для самостоятельного частичного просмотра, посмотрите!

Код контроллера:

[HttpPost]
public ActionResult RefreshSelfUpdatingPartial() {

            // Setting the Models Content
            // ...

            return PartialView("_SelfUpdatingPartial", model);
}

Код частичного (_SelfUpdatingPartial.cshtml):

@model YourModelClass

<script type="text/javascript">
setInterval(function () {
    $.post('@Url.Action("RefreshSelfUpdatingPartial")', function (data) {
            $('#SelfUpdatingPartialDiv').html(data);
        }
    );
}, 20000);
</script>
// Div
<div id="SelfUpdatingPartialDiv">

// Link to Refresh per Click
<p>
@Ajax.ActionLink("Aktualisieren", "RefreshFlatschels", new AjaxOptions() {
UpdateTargetId = "FlatschelList",
HttpMethod = "Post", InsertionMode = InsertionMode.Replace
})
</p>

// Your Code
// ...

</div>

Код для интеграции Partial в "Main" -View (ViewWithSelfupdatingPartial.cs):

 @Html.Partial("_FlatschelOverview", Model)

Ответ 4

Тег <meta refresh ..> в HTML будет работать для вас. Его лучший вариант

Ответ 5

Традиционные элементы управления не работают в ASP MVC

Вы можете сделать это с помощью таймеров JQuery http://plugins.jquery.com/project/timers

Другим вариантом может быть использование функции Delay

В вашей цели так же просто, как обновить всю страницу, эта ссылка SO будет представлять интерес: Автоматическое обновление в ASP.NET MVC

Надеюсь, что это поможет.