Обслуживающий документ Word по нажатию кнопки на странице C# asp.net

Когда код помещается в событие onClick, он не отображает диалоговое окно открытия сохранения, и никакое исключение не генерируется, но работает нормально, событие onLoad открывает открытое диалоговое окно сохранения, чтобы сохранить файл слова.

string strDocBody;
strDocBody = "<html " + "xmlns:o='urn:schemas-microsoft-com:office:office' " + "xmlns:w='urn:schemas-microsoft-com:office:word'" + "xmlns='http://www.w3.org/TR/REC-html40'>" + "<head>" + "<title>Version and Release Management</title>";

strDocBody = strDocBody + "<!--[if gte mso 9]>" + "<xml>" + "<w:WordDocument>" + "<w:View>Print</w:View>" + "<w:Zoom>100</w:Zoom>" + "<w:DoNotOptimizeForBrowser/>" + "</w:WordDocument>" + "</xml>" + "<![endif]-->";

strDocBody = strDocBody + "<style> @page" + "{size:8.5in 11.0in; mso-first-footer:ff1; mso-footer: f1; mso-header: h1; border:solid navy 2.25pt; padding:24.0pt 24.0pt 24.0pt 24.0pt;" + " margin:0.75in 0.50in 0.75in 0.50in ; " + " mso-header-margin:.5in; " + " mso-footer-margin:.5in; mso-paper-source:0;}" + " div.Section1" + " {page:Section1;}" + "p.MsoFooter, li.MsoFooter, div.MsoFooter{margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:center 3.0in right 6.0in; font-size:12.0pt; font-family:'Arial';}" + "p.MsoHeader, li.MsoHeader, div.MsoHeader {margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:center 3.0in right 6.0in; font-size:12.0pt; font-family:'Arial';}" + "-->" + "</style>" + "</head>";

strDocBody = strDocBody + "<body lang=EN-US style='tab-interval:.5in'>" + "<div class=Section1>" + "<h1>This is my Heading</h1>" + "<h2>This is my Sub Heading</h2>" + "<p style='color:navy;'> This is blue text</p>" + "<p style='font-weight:bold; color:green;'><u> This is green bold underlined text </u></p>" + "<p style='color:red'><I>" + DateTime.Now + "</I></p>" + "<!--[if supportFields]>" + "<div style='mso-element:header' id=h1><p class=MsoHeader><span style='mso-tab-count:4'></span><span style='mso-field-code: PAGE '></span> </p></div>" + "<div style='mso-element:footer' id=f1> " + "<p class=MsoFooter style='border:none;mso-border-bottom-alt:solid windowtext .75pt;padding:0in;mso-padding-alt:0in 0in 1.0pt 0in'><o:p> </o:p></p> " + "Page <span style='mso-field-code: PAGE '><span style='mso-no-proof:yes'>1</span></span> of <span style='mso-field-code: NUMPAGES '></span>" + " <span style='mso-tab-count: 12'> <span style='mso-field-code: DATE '></span> " + " </p></div><![endif]-->" + "</div> </body> </html> ";

//Force this content to be downloaded as a Word document
Response.AddHeader("Content-Type", "application/msword");
Response.AddHeader("Content-disposition", "attachment; filename=TEST.doc");
Response.Charset = "";
Response.Write(strDocBody);

3 ответа

Решение

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

Если вы хотите, чтобы это происходило при нажатии кнопки, эта кнопка должна перенаправить пользователя на другой URL-адрес, который отправит данные документа, и ничего больше.

Создайте страницу специально для обслуживания документа, пусть это будет Document.aspx. Теперь я не знаю, нужно ли вам выполнять какую-либо дополнительную логику при нажатии кнопки. Если нет, вы можете просто использовать LinkButton:

<asp:LinkButton runat="server" ID="docLink" Text="Document" 
                PostBackUrl="Document.aspx" />

В противном случае просто добавьте перенаправленный вызов в ваш обработчик onClick:

protected void btnButton1_Click(object sender, EventArgs e)
{
    // ....
    Response.Redirect("Document.aspx");
}

Это может быть связано с тем, что заголовки уже размещены в браузере клиента. Попробуйте очистить с помощью Response.Clear(), убедитесь, что вы не в Ajax-вызове. Другой трюк - открыть новую страницу, используя привязку на стороне клиента с динамически компилируемым аргументом.

РЕДАКТИРОВАТЬ: конечно, если вы очистите свой ответ, страница будет пустой после запроса пользователя, чтобы загрузить файл. Всегда помните о синхронном поведении клиент-сервер по HTTP.

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

Другие вопросы по тегам