2010-01-06 4 views
2

Следующий код прекрасно работает:Сброс курсор ожидания в браузере с Content-Disposition: вложение

<script type="text/javascript"> 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_initializeRequest(InitializeRequest); 
    prm.add_endRequest(EndRequest); 

    function InitializeRequest(sender, args) { 
     document.body.style.cursor = 'progress'; 
    } 
    function EndRequest(sender, args) { 
     document.body.style.cursor = 'default'; 
    } 
</script> 

Когда ответ возвращает вложение, хотя (в формате PDF от управления ReportViewer, например):

Response.AddHeader("Content-Disposition", "attachment; filename=some.pdf") 

EndRequest() никогда не срабатывает, и курсор «прогресс» не сбрасывается. Вызов Javascript, например.

ScriptManager.RegisterStartupScript(this, this.GetType(), "close", 
    "parent.EndRequest(...);", true); 

будет делать трюк, но это невозможно из-за расположения контента. Можете ли вы придумать способ сделать это правильно - показать курсор ожидания во время рендеринга PDF и вернуться к нормальному курсору при отображении PDF? Я предполагаю здесь контекст C#, но проблема не связана с языком или платформой.

ответ

2

Проблема заключается в том, что функция EndRequest не запускается. Вы пытались выяснить, стреляют ли события pageLoading и pageLoaded?

У меня такое чувство, что эти события не срабатывают, потому что на страницу ничего не отправлено (вложение не доходит до страницы так же, как это делает встроенный документ).

Я бы переместил загрузку файла в iframe. Вот пример того, как это сделать:

function InitializeRequest(sender, args) { 
    document.body.style.cursor = 'progress'; 

    var iframe = document.createElement("iframe"); 
    iframe.src = 'your pdf file'; 
    iframe.style.display = "none"; 
    document.body.appendChild(iframe); 
} 

Затем вы можете получить доступ к событию onload iframe.

EDIT:

Далее поиск привел меня к this page. Кажется, он делает все, что вы хотите сделать.

+0

pageLoaded также не запускается, и это имеет смысл в некотором смысле, потому что ответ действительно не возвращает его в контекст страницы браузера. Ничего не загружается, что заменяет текущую страницу. – cdonner

+0

См. Измененный ответ. Включает более подробную информацию. –

+1

Идея iframe, похоже, работает. Огромное спасибо. – cdonner