我有以下代码,可以在当前页面的新窗口中打开PDF文件:
<asp:LinkButton ID="lnkView2" Text="View in Browser" OnClientClick="window.document.forms[0].target='_blank';" runat="server" OnClick="ViewFile" />
protected void ViewFile(object sender, EventArgs e)
{
strFileName = "APP_" + k.Trim(' ') + "_" + c.Trim(' ') + "_NoID.pdf";
Session["fileName"] = strFileName;
Response.Redirect("OpenFilePDF.ashx?fileVar=" + Session["fileName"]);
}
OpenFilePDF.ashx
正在使用网站服务器中创建的文件夹:
<%@ WebHandler Language="C#" Class="OpenFilePDF" %>
using System;
using System.Web;
using System.IO;
public class OpenFilePDF : IHttpHandler {
public void ProcessRequest (HttpContext context) {
System.Web.HttpRequest request2 = System.Web.HttpContext.Current.Request;
string strSessVar2 = request2.QueryString["fileVar"];
try
{
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/pdf";
byte[] fileByteArray = File.ReadAllBytes(Path.Combine(@"C:\PDFGenerate", strSessVar2));
response.AddHeader("Content-disposition", String.Format("inline; filename={0}", strSessVar2));
response.BinaryWrite(fileByteArray);
response.End();
}
catch (Exception ce)
{
}
}
public bool IsReusable {
get {
return false;
}
}
}
当我点击LinkButton
时,它会从当前页面打开一个新窗口,一切都很好。
但我可以说,点击当前页面上的以下按钮(或任何链接):
<asp:Button ID="btnGeneratePDF" ClientIDMode="Static" runat="server" Text="Generate PDF" CommandArgument='#SOMETHING GOES HERE' />
每次我想要防止它一直打开新窗口。它不打开新窗口的唯一方法是,如果我不打开新页面并在同一页面上重定向,并且用户返回到当前页面,则每次都不会打开新窗口。
如何修改代码,以便只有LinkButton
控件才会打开一个新窗口,而其他任何控件都会在同一页面而不是新窗口中打开?
答案 0 :(得分:2)
AFAIK,没有内置方式来指定&#34;新标签或窗口,但只有一次&#34;。在纯HTML中,处理此问题的属性是:
<a href="yourURL" target="_blank">Some Link</a>
每次单击该元素时,都会出现一个新选项卡或窗口(但仅适用于该链接)。然而,在你的情况下发生的事情是.NET正在为你输出如下内容:
<a href="yourURL" onclick="window.document.forms[0].target='_blank';">Some Link</a>
虽然他们起初看起来很相似,但事实并非如此。当点击发生时,您的代码将转换您最初看起来像的页面:
<!-- this is the ASP.NET form that handles all postbacks for all controls -->
<form>
...
</form>
向
<form target="_blank">
<!-- well now you're screwed -->
...
</form>
谢天谢地,修复很简单。
ASPX:
<a ID="lnkView2" runat="Server" target="_blank">some text</a>
代码背后:
protected void Page_Load(...
{
...
strFileName = "APP_" + k.Trim(' ') + "_" + c.Trim(' ') + "_NoID.pdf";
Session["fileName"] = strFileName;
lnkView2.HRef = OpenFilePDF.ashx?fileVar=" + Session["fileName"];
}
另一个有利的原因是,您正在减少浏览器服务器的往返。现在你的方式是page->postback redirect->ashx
,而直接链接可以解决你的问题与其他控件,并将路径转换为page->ashx
切出一个不必要的步骤。
答案 1 :(得分:1)
这是一个更简单的解决方法,但请记住,遵循这条道路是技术债务的一种形式。您正在介绍一个潜在的未来错误来修复当前错误,但它在短期内涉及更少的代码更改。
还原我之前回答的所有更改,将其添加到ASPX页面的顶部:
<script type="text/javascript">
var retargetFunc = function() {
window.document.forms[0].target='_self';
}
var ele = window.document.forms[0];
if(ele.addEventListener){
ele.addEventListener("submit", retargetFunc , false);
}else if(ele.attachEvent){
ele.attachEvent('onsubmit', retargetFunc );
}
</script>
这会怎么做?提交表单后,它会将target="_blank"
更改回target="_self"
的默认行为,因此除了链接按钮之外的任何进一步控制点击都会发布当前窗口。但是,由于链接按钮仍然会在点击时设置目标,因此只有点击链接按钮本身才会转到另一个标签。
在所有条件相同的情况下,如果您使用我之前的解决方案,我会更喜欢它,但这个肮脏的答案可能对您有用,并且更容易实现。