【问题标题】:How to open a new window from only one asp.net control如何仅从一个 asp.net 控件打开新窗口
【发布时间】:2014-07-31 16:24:32
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    AFAIK,没有内置方法来指定“新选项卡或窗口,但只有一次”。在纯 HTML 中,处理此问题的属性是:

    &lt;a href="yourURL" target="_blank"&gt;Some Link&lt;/a&gt;

    每次您单击该元素时,都会出现一个新的选项卡或窗口(但仅限于该链接)。但是,在您的情况下,.NET 正在为您输出如下内容:

    &lt;a href="yourURL" onclick="window.document.forms[0].target='_blank';"&gt;Some Link&lt;/a&gt;

    虽然它们乍一看可能很相似,但实际上并非如此。当点击发生时,您的代码将转换您的页面,最初看起来像:

    <!-- 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:

    &lt;a ID="lnkView2" runat="Server" target="_blank"&gt;some text&lt;/a&gt;

    后面的代码:

    protected void Page_Load(...
    {
       ...
       strFileName = "APP_" + k.Trim(' ') + "_" + c.Trim(' ') + "_NoID.pdf";
       Session["fileName"] = strFileName;
       lnkView2.HRef = OpenFilePDF.ashx?fileVar=" + Session["fileName"];
    }
    

    这很好的另一个有利原因是您减少了浏览器到服务器的往返行程。您现在拥有它的方式,它转到page-&gt;postback redirect-&gt;ashx,而直接链接将解决您与其他控件的问题并将路径转换为page-&gt;ashx,从而减少一个不必要的步骤。

    【讨论】:

    • 那么把page_load改成链接点击事件?
    • 另外别忘了把LinkBut​​ton控件改成简单的&lt;a&gt;标签
    • 每次单击按钮时,session 变量都会发生变化,因此 PAGE_LOAD 不起作用。 :/ 有什么解决方法吗?我必须以某种方式在没有页面加载代码的情况下访问 SESSION...
    • 当您单击按钮时,什么会修改Session 变量?该代码可以移动到Page_Load吗?
    【解决方案2】:

    这里有一个更简单的解决方法,但请记住,遵循此路径是一种技术债务。您正在引入一个潜在的未来错误来修复当前错误,但在短期内它涉及的代码更改较少。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      相关资源
      最近更新 更多