この特定のケースでは、Response.Writeを使用して直接書き込むことが最善の解決策であるかどうかはわかりません。私の記憶はこれに大げさですが、私は(ずっと前に)Response.Writeを介して出力に直接書き込みを試みたようで、あなたが説明したような奇妙な振る舞いに遭遇しました。他のSOメンバーは、これが発生する理由をより詳しく説明できるはずですが、Response.Writeが目的の動作を実現するかどうかについては、ページのライフサイクルとIISストリームのどこにいるかに少し関係があると思います。ファイルをクライアントに直接プッシュする場合は、MVCを検討してください。MVCを使用すると、FilePathResultクラスを介してファイルをクライアントに直接プッシュすることがはるかに簡単になります。必要に応じて、MVCとWebFormsを組み合わせて組み合わせることができます。スコットハンスレマンはここでこれを行う方法を示しています。
ただし、WebFormsを使い続けたい場合は、RegisterStartupScriptを使用して、それぞれのボタンをクリックして2つのローカルPDFのいずれかを開く方法を示す簡単なページをまとめました。
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Register Startup Script Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="bnOpenTest1PDF" runat="server"
OnClick="opnTest1PDF" Text="OpenPDF1" />
<asp:Button ID="bnOpenTest2PDF" runat="server"
OnClick="opnTest2PDF" Text="OpenPDF2" />
</div>
</form>
</body>
</html>
コードビハインド:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void opnTest1PDF(Object sender, EventArgs e)
{
Page.ClientScript.RegisterStartupScript(
this.GetType(),
"myFileOpenScript",
"<script>window.open('test1.pdf');</script>");
}
protected void opnTest2PDF(Object sender, EventArgs e)
{
Page.ClientScript.RegisterStartupScript(
this.GetType(),
"myFileOpenScript",
"<script>window.open('test2.pdf');</script>");
}
}