从Button Click定位HTTP Handler的方法

时间:2011-02-14 17:16:30

标签: asp.net httphandler

此处的主要目的是将处理程序作为目标,以下载正在预览的文件。

文件有两种不同的条件,一种是已经保存在数据库中,然后是通过查询字符串给处理程序的以下参数

COIHandler.axd动作= preview_saved&安培; letterId = XXXX

尚未保存的一个,我将其存储在会话中并以下列方式定位处理程序

COIHandler.axd?动作= preview_unsaved

然后处理程序将在我完成后处理清除会话。 有关如何实现这一点的任何想法。对于http处理程序来说还是新手。

澄清

我在Button类的子类版本中有一个OnClientClick属性,它允许我将javascript附加到它将在客户端执行。这就是我希望定位发生的地方。

我希望用户在点击下载按钮时也能保持在同一页面上。

我不想简单地在javascript中进行重定向来定位处理程序,如果可能的话我想避免弹出窗口。不确定是否留下任何选项

3 个答案:

答案 0 :(得分:0)

你的处理程序实际上是.ashx。除此之外你的方法似乎很好。您可以检查传递给PrcoessRequest方法的上下文。

public void ProcessRequest(HttpContext context)
{
    switch(context.Request.QueryString["Action"].ToLower())
    {
       case "preview_saved":
           //do stuff for saved
       case "preview_unsaved":
           //do stuff for unsaved
     }
}

更新如果您想要一个中央处理程序,那么您要么想要在通话结束时重定向用户,在这种情况下您还需要传递returnUrl查询字符串中的参数。然后你可以做一个context.Response.Redirect(context.Request.QueryString["returnUrl"])。或者,如果您希望页面保持其状态,那么您将不得不对您的处理程序进行Ajax调用。

答案 1 :(得分:0)

在回复Yads注释时,您可以使用页面上的按钮单击处理程序来下载文件,而无需弹出窗口或单独的HTTP处理程序。

protected void btnDownload_OnClick(object sender, EventArgs args)
{       
    PDFContentData data = GeneratePDFData(); //parses strings from some source (as mentioned in comments)
    WebFileUtil.InvokePDFDownload(Page.Context, data);
}

public static class WebFileUtil
{
    public static void InvokePDFDownload(HttpContext context, PDFContentData data)
    {
        context.Response.Clear();
        context.Response.ClearContent();
        context.Response.ClearHeaders();

        FileStore.generateDocument(data, context.Response.OutputStream);

        context.Response.ContentType = "application/pdf"; 
        context.Response.ContentEncoding = System.Text.Encoding.UTF8;
        context.Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}_Documenth.pdf", DateTime.Now.ToShortDateString()));
        context.Response.End();
    }
}

答案 2 :(得分:0)

首先,非常感谢所有可能的解决方案,他们有助于开箱即用。

我想出了一个我认为可以分享的独特解决方案。

  1. 我在页面的html标记中放置了一个不可见的iframe。

  2. 然后我在我的服务器控件下载按钮中设置了一个名为OnClientClick的属性(这允许我将参数字符串呈现给html的onclick属性)

    我将属性设置为javascript方法,该方法体现了一个递归算法,导航到页面的顶部父框架,一旦到达该点,我使用一个简单的JQuery选择器来查找我在步骤1中提到的iframe 。(递归的原因是为了保持对Master Pages的支持,你将在帧中有框架)。

  3. 将iframe的src属性设置为目标HTTP处理程序。应用的行为导致iframe加载请求的源...但在这种情况下它是一个处理程序,并且由于它最初来自直接用户输入(通过单击“下载”按钮),您甚至不会遇到问题用IE7 +获取黄条吧

  4. 处理程序提供请求,文件将提供给浏览器

  5. 耶!