我不确定直接用 Response.Write 写是在这种特殊情况下的最佳解决方案。我对此的记忆很模糊,但似乎我(很久以前)尝试通过 Response.Write 直接写入输出并遇到了一些奇怪的行为,就像你描述的那样。其他 SO 成员应该能够更好地详细说明为什么会发生这种情况,但我认为这与您在页面生命周期和 IIS 流中所处的位置有关 Response.Write 是否会实现所需的行为。如果你想将文件直接推送到客户端,你可以考虑 MVC。MVC 使得通过 FilePathResult 类将文件直接推送到客户端变得更加容易。如果您愿意,可以混合搭配 MVC 和 WebForms。Scott Hansleman在这里展示了如何做到这一点。
但是,如果您想坚持使用 WebForms,那么这是我整理的一个简单页面,以展示如何使用 RegisterStartupScript 通过单击相应的按钮打开两个本地 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>");
}
}