如何从一个asp.net控件打开一个新窗口

时间:2014-07-31 16:24:33

标签: c# asp.net

我有以下代码,可以在当前页面的新窗口中打开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控件才会打开一个新窗口,而其他任何控件都会在同一页面而不是新窗口中打开?

2 个答案:

答案 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"的默认行为,因此除了链接按钮之外的任何进一步控制点击都会发布当前窗口。但是,由于链接按钮仍然会在点击时设置目标,因此只有点击链接按钮本身才会转到另一个标签。

在所有条件相同的情况下,如果您使用我之前的解决方案,我会更喜欢它,但这个肮脏的答案可能对您有用,并且更容易实现。