2015-03-10 4 views
1

У меня есть программа на C#, которая будет использоваться для загрузки сгенерированного документа Word. Кроме того, после его создания свойство «Час стекла» в пользовательском интерфейсе должно быть сброшено до значения по умолчанию. Для этого я вызываю одну функцию javascript с помощью scriptmanager, которая может быть выполнена только в том случае, если оператор появляется последним. К сожалению, шаг до того, как есть код для загрузки документа Word. когда это происходит, программа теряется и никогда не возвращается и выполняет оставшуюся часть программы, в которой присутствует менеджер сценариев, чтобы остановить песочные часы. Помещение диспетчера сценариев впереди кода загрузки также не поможет. Я страдаю от этой специфической проблемы. Пожалуйста, помогите, спасибо!Управление программой исчезает и теряется после загрузки функции excel/word

Ниже приведен код,

private void DownloadFile(string filename) 
{ 
     System.IO.FileInfo file = new System.IO.FileInfo(filename); 
     if (file.Exists) 
     { 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.FullName); 
      HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString()); 
      HttpContext.Current.Response.ContentType = "Application/msword"; 
      HttpContext.Current.Response.WriteFile(file.FullName); 
      //HttpContext.Current.Response.Flush(); 
      HttpContext.Current.Response.End(); 
      ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "script", "stopHourglass()", true); 
     } 
} 
+0

Вы пытались «уловить» возможное «исключение» в блоке кода релеванта? Исключение может быть подавлено, в зависимости от контекста вызова ... –

ответ

0

В принципе. вы не можете этого сделать. Вы можете отправлять только один ответ клиенту одновременно. Это либо файл, либо обновление страницы, вы не можете иметь оба. У вас также есть response.end, что говорит сценарию эффективно останавливаться.

Я предлагаю вам отказаться от JavaScript для отображения песочных часов

0

Когда Response.End() называется, вы больше не получите ответ от сервера, потому что Response.End() бросает исключение по своей природе, и вы не можете делать ничего об этом. Что вам нужно сделать, так это переключить заказ. Как только у вас будет готов файл для загрузки, используйте ScriptManager, чтобы зарегистрировать скрипт, который делает __doPostBack с определенным аргументом. Позже в Page_Load вы прочтете этот аргумент и выполните загрузку соответственно. Между тем, после ScriptManager.RegisterStartupScript (или ScriptManager.RegisterClientScriptBlock), сделайте свою логику очистки.

Кодекс будет выглядеть следующим образом:

ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "DownloadFileKey", "__doPostBack('', '" + YourArgumentConstStr + "');", true); 
// You clean up code here. 

И в Page_Load:

if (Request["__EVENTARGUMENT"] != null && Request["__EVENTARGUMENT"] == YourArgumentConstStr) 
    // Download the file here. 

Теперь ваш следующий вопрос будет: Это возможный путь «опрятный», чтобы сделать это? В принципе, если вы настаиваете на том, чтобы все на одной странице, тогда да, вам придется реализовать такое обходное решение. Однако общая тенденция заключается в том, чтобы открыть еще одну вкладку (новую страницу), которая только загружает. Одним из популярных примеров является веб-сайт Microsoft. Проверьте, как вы загружаете .NET Framework here.

+0

@ yazanpro..I кажется хорошей идеей, я пробовал точно так же, я сначала вызываю сценариста, который вызывает функцию javascript, в которой я написал код как указано ниже., функция doPostBack (сообщение) { document.body.style.cursor = 'auto'; предупреждение («вызов загрузки страницы снова!»); __doPostBack ('Page_Load', сообщение); } – user3585252

+0

Эта функция вызвана, я также сохранил точку останова при загрузке страницы, но происходит то, что когда строка _dopostback выполняется, она никогда не переходит на загрузку страницы этой страницы, но страница обновляется. Действительно странно, как страница обновляется, но я не могу поймать событие с точкой останова при загрузке страницы ... любая идея для этого? – user3585252

+0

Нет первого аргумента в __doPostBack (no 'Page_Load'), если у вас нет панели обновления, тогда вы можете передать свой идентификатор в качестве первого аргумента для создания частичного сообщения. Придерживайтесь образца кода, который я предоставил, и посмотрите, работает ли он. Тогда вы можете настроить его, если вам нужно. – yazanpro