2009-04-22 5 views
2

save диалог сохраняет файл на локальном компьютере. Но после этого моя страница стоит там и ничего не делает для остальной части моего процесса. Я использую ниже код, чтобы открыть сохранить диалогОбновление страницы в ASP.NET

protected void lnkbtnDownload_Click(object sender, EventArgs e) 
{ 
    string fileName = startupPath + "bin\\Inbox.mdb"; 
    System.IO.FileInfo targetFile = new System.IO.FileInfo(fileName); 

    if (targetFile.Exists) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + targetFile.Name); 
     Response.AddHeader("Content-Length", targetFile.Length.ToString()); 
     Response.ContentType = "application/octet-stream"; 
     Response.WriteFile(targetFile.FullName);       
     Response.End(); 
    } 
} 

HTML-код:

<asp:Button id="lnkbtnDownload" runat="server" CausesValidation="false" 
    Text="Download" CssClass="buttonstyle" OnClick="lnkbtnDownload_Click"></asp:Button> 

, но после того, как файл является не сохранить на локальный компьютер и сохранить диалог близко, моя страница никакого ответа на все , Могу ли я узнать, как сделать обратную ссылку на страницу после закрытия диалогового окна сохранения?

ответ

9

Потому что вы вызываете Response.End, это останавливает реакцию страницы.

+1

Да. Но поскольку тип контента ответа был изменен с "text/html" на "application/octet-stream "в браузере не будет выводиться вывод. Я бы также предложил использовать обработчик для работы с файлом - например, вы могли бы передать Guid в строке запроса, чтобы идентифицировать нужный файл. –

4

Я думаю, вам следует открыть всплывающее окно/обработчик, выполняющий эту операцию Response.WriteFile.

+0

target = "_ blank" <- Вы можете добавить это в свой LinkButton (хотя визуальная студия даст вам squigglies –

0

Я бы сказал, что вы можете запустить этот код внутри iframe или открыть всплывающее окно для запуска загрузки файла. В этом случае вы перезаписываете ответ, и страница, которую вы ожидали получить, потеряна.

Итак, я переместил бы этот код на специальную страницу и реализовал бы одно из двух упомянутых выше решений.

0

Вы не можете ответить ни на один запрос (т. Е. Кнопку обратной передачи) с 2 ответами.

Вы также можете изменить обратную передачу, чтобы перенаправить на отдельную страницу загрузки/подтверждения, которая, в свою очередь, инициирует загрузку с использованием iframe.

См this question

5

Поместите этот код в HttpHandler, а затем ссылку на этот обработчик с исходной страницы, передавая любую информацию, нуждается в обработчик.

+0

Гоша, там очень много которые, похоже, происходят вокруг этой проблемы. Простое решение HttpHandler похоже на простой и правильный способ решить эту проблему. –

1

Марк Brackett-х answer на подобный вопрос должен работать здесь, за исключением того, что вам не нужно кросс-страничный атрибут постбэк URL:

<script type="text/javascript"> 
    var oldTarget, oldAction; 
    function newWindowClick(target) { 
     var form = document.forms[0]; 
     oldTarget = form.target; 
     oldAction = form.action; 
     form.target = target; 

     window.setTimeout(
     "document.forms[0].target=oldTarget;" 
     + "document.forms[0].action=oldAction;", 
     200 
    ); 
    } 
</script> 

<asp:LinkButton runat="server" id="lnkbtnDownload" 
    CausesValidation="false" Text="Download" CssClass="buttonstyle" 
    OnClick="lnkbtnDownload_Click" 
    OnClientClick="newWindowClick('download');" /> 

Это приведет к обратной передачи происходит в новом окне, и ваш обработка ответов будет позаботиться о загрузке. Исходная форма окна восстанавливается для будущего взаимодействия/обратной передачи.

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