2011-05-29 1 views
3

Я занимаюсь разработкой веб-сайта с помощью ASP.NET MVC 3.Continous обновления в PartialView с помощью ASP.NET MVC 3

У меня есть несколько разделов, содержащих новости из разных отделов, как показано на рисунке ниже:

http://i.stack.imgur.com/G21qi.png

разделы добавляются к MasterPage с помощью

@Html.Action("_News", "Home", new { id = 1 }) 

где ID = 1 "Ledelsen", 2 = "Omstillingen" и так о п.

Мой контроллер содержит следующие действия:

[ChildActionOnly] 
public ActionResult _News(int id) 
{ 
    // controller logic to fetch correct data from database 
    return PartialView(); 
} 

я получил CRUD и работает, но мой вопрос, как я могу обновить PartialViews без обратной передачи, на заданном интервале?

Я предполагаю, что для этого я должен использовать Javascript/jQuery, но я не смог.

Может ли кто-нибудь указать мне в правильном направлении или еще лучше, укажите пример, как это сделать?

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

EDIT: Просто для уточнения я не хочу вся страницу, чтобы обновить, но только сделать асинхронные обновления из partialviews

ответ

8

В вашем частичном виде, я предлагаю обертывание Все дело в DIV:

<div id="partial1"> 

в JavaScript вам нужна функция, чтобы использовать AJAX для загрузки частичного вида в DIV:

$("#partial1").load("_News", { id="1"}); 

Это использование jQuery. Некоторая документация here. В принципе, это заменит div, указанный в представлении, генерируемом при вызове вашего действия _News. Идентификатор может быть изменен, если вы добавите некоторую логику в вызов javascript.

Затем обернуть вызов load() в setTimeout():

var t = setTimeout(function() {$("#partial1").load("_News", { id="1"});}, 60000); 

, который будет запускать ВКЛЮЧЕНЫ функцию каждые 60 секунд. t может использоваться, таким образом, clearTimeout(t) в любом месте вашего javascript-кода, чтобы остановить автоматическое обновление.

EDIT

Это должно решить проблему кэширования. Спасибо @iko за предложение. Я заметил, что для этого вам нужно cache: false.

var t = setTimeout(function() { $.ajax({ 
            url: "_News", 
            data: { "id": "1" }, 
            type: "POST", 
            cache: false, 
            success: function (data) { 
              $("#partial1").innerHTML = data; 
            }}); }, 60000); 
+0

Я, как, нет эксперта по jQuery, но разве вы не пропускаете функцию обертки вокруг вызова в setTimeout? Похоже, что это вызовет нагрузку, а затем передаст все функции загрузки (объект запроса?) В setTimeout, что, я думаю, приведет к ошибке. – AHM

+0

@AHM Я думаю, что пример правильный, хотя я бы не сказал, что он завершен. .load() - обертка вокруг .ajax(). Он загружает возвращенный html в вызывающий элемент. Вы можете включить функцию обратного вызова, но это не обязательно. И setTimeout просто вызывает код включения по расписанию. –

+0

Хммм .... если нагрузка не возвращает замыкание, то это неправильно. SetTimeout определенно требует обратного вызова, поскольку это первый аргумент. Я думаю, что это должно быть setTimeout (function() {$ ("# partial1"). Load ("_ News", {id = "1"})}, 60000) – AHM

0

Я собираюсь передать вам ответ, который я дал связанный с этим вопрос "UpdatePanel" in Razor (mvc 3) за отправную точку. Обратите внимание, что это не то, что отличается от ответа Стива Мэллори, но выделяет некоторые другие моменты.

Разница, тем не менее, в том, что вам может потребоваться удалить атрибут [ChildActionOnly], если вы хотите обновить каждый отдельный просмотр отдельно (только для обновления только идентификатора 1 или только для обновления id 2).

Этот скрипт может быть помещен в возвращенный частичный.

<script type="text/javascript"> 
    setInterval(function() 
    { 
      $.load('<%= Url.Action("_News", "Home", new { id = Model.Id }) %>', function(data) { 
      $('#partial_'@(Model.Id)').html(data); 
     }); 
    } 
    , 30000); 
</script> 

<div id="[email protected](Model.Id)" /> 

 Смежные вопросы

  • Нет связанных вопросов^_^