2008-11-13 4 views
13

У меня есть контроллер MVC, который проходит через процесс, задает некоторые данные View Data и возвращает результаты этих данных пользователю в представлении. Время процесса зависит от количества обрабатываемых данных. Мне нужен хороший способ отображения анимированного файла .gif в представлении, пока процесс выполняется, позволяя пользователю знать, что что-то происходит.Индикатор загрузки ASP.Net MVC

Я рассмотрел различные методы AJAX и частичные виды, но до сих пор не могу найти хороший способ выполнить это. Я действительно хотел, чтобы у меня был ActionFilter, который вернул View или Partial View во время события OnActionExecuting, которое отображает этот анимированный .gif, а затем, как только Controller завершит процесс и вернет ViewData, представление или частичное представление с фактическим представлением Данные могут отображаться.

Также кажется, что jQuery сможет обеспечить приятный асинхронный способ вызова действия контроллера в фоновом режиме, а затем визуализировать представление. Любая помощь будет оценена по достоинству.

ответ

24

В контроллере:

public JsonResult GetSomething(int id) 
{ 
    return Json(service.GetSomething(id)); 
} 

В представлении (JavaScript, с помощью JQuery):

$('#someLink').click(function() 
{ 
    var action = '<%=Html.ResolveUrl("~/MyController.mvc/GetSomething/")%>' + $('#someId').val() + '?x=' + new Date().getTime(); 
    $('#loading').show() 
    $.getJSON(action, null, function(something) 
    { 
     do stuff with something 
     $('#loading').hide() 
    }); 
}); 

Обратите внимание, что это предполагает, что маршрут, где 'идентификатор' приходит после того, как действие. Параметр «x» в действии - это победить агрессивное кэширование в IE.

В окне просмотра (наценки):

<img id="loading" src="images/ajax-loader.gif" alt=""/> 
<!-- use a css stlye to make display:none --> 

Получить погрузчик ГИФС here.

Также обратите внимание, что вам не обязательно делать это с Json. Вы можете получать другие вещи, такие как HTML или XML, из действия контроллера, если хотите.

+0

Мне пришлось добавить # к «загрузке», чтобы его подбирали так: $ ('# loading'). Show() и $ ('# loading'). Hide() для двух частей JS. .. в целом, спасибо JS ... это был безупречный .. – 2011-07-07 19:26:25