奇怪的__EVENTTARGET行为,可能的错误?

时间:2011-03-25 18:09:39

标签: c# javascript asp.net postback

赫罗。我有一个奇怪的问题,我正在处理它涉及两个按钮,一个HTML(客户端“导出到Excel”)和一个ASP(服务器端“Go”)按钮:

enter image description here

以下是两个按钮的html:

<asp:Button ID="btnGo" runat="server" Text="Go" OnClick="btnGoClick" Width="35px" />
<input id="btnExport" type="button" value="Export to Excel" disabled="disabled" onclick="btnExClick(this)" onmouseover="return doHover(this)" onmouseout="this.style.backgroundColor='';" style="width: 125px" />

基本上,用户在下拉列表中选择要加载的贷款,然后单击“Go”,查询数据库并加载数据网格。加载数据网格时,“导出到Excel”按钮变为启用状态,当用户将鼠标悬停在熄灭状态时,将变为绿色和绿色。点击后,它会触发,只会调用__doPostBack(btnEx.id, '');

编辑每个ShadowWizard的请求:这是我的btnExClick():

function btnExClick(btn)
{
    document.forms[0].target = "_blank";  //newly added line from shadowwizard
    __doPostBack(btn.id, '');
}

在我的代码隐藏中,我有以下代码:

protected void Page_Load(object sender, EventArgs e)
    {
        .....

        if (Request.Form["__EVENTTARGET"] == "btnExport")
        {
            this.ExportExcel();
        }
    }

    protected void ExportExcel()
    {
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("content-disposition", "attachment;filename=Optoma Loaner Report.xls");
        Response.Charset = "";
        this.EnableViewState = false;

        System.IO.StringWriter sw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);

        dgResults.RenderControl(htw);

        Response.Write(sw.ToString());
        Response.End();
    }

这一切都很好,我得到了一张漂亮的Excel表格。唯一的问题是在我“导出到Excel”之后,我的“开始”按钮不再有效。它只是使用__EVENTTARGET仍然=“btnExport”执行“回发”,因此它会尝试再次导出到excel ..它甚至没有转到它的服务器端onclick事件处理程序!有谁知道为什么会这样?
我假设它与我将数据网格导出到Excel工作表的方式有关,因为当我注释掉this.ExportExcel();时,它继续正常工作(尽管“导出到Excel”按钮点击它后再回到被禁用状态,我不知道为什么。通常不这样做。)

5 个答案:

答案 0 :(得分:3)

我有这个问题。

修复方法是在UseSubmitBehavior="false"按钮上设置btnGo

UseSubmitBehavior="false"会使该按钮使用.NET的回发方法,该方法会将__EVENTTARGET设置为&#34; btnGo&#34;单击按钮时。没有它,该按钮使用浏览器的默认方法提交按钮,使__EVENTTARGET保持不变,因此重新提交以前的值&#34; btnExport&#34;。

答案 1 :(得分:1)

这可能是因为您清除响应并结束它。我会尝试在提交表单之前更改表单目标,在新的浏览器窗口中打开Excel。

怎么做?通过在btnExClick函数中添加这样的行:

document.forms[0].target = "_blank";

希望这会导致Excel在新窗口中打开并保持原始窗口不变。

答案 2 :(得分:0)

通常,您将excel生成器绑定到通用处理程序(.ashx文件)。处理程序的全部目的是获取一些参数并发出excel文件。

在您的页面代码中,您只需单击按钮即可拉出.ashx文件。

答案 3 :(得分:0)

没有得到太多回应,也许我可以激起一些回应。我认为这可能发生的原因是因为响应没有被返回到“浏览器”,可以这么说,而是返回到excel表。我认为这就是为什么我没有看到我的html控件恢复到默认状态,就像它们通常应该在回发上一样。所以也许当我尝试做另一个回发时,它仍然像以前一样给它提供相同的回发..但是我怎么能阻止它...

好吧,我使用html按钮的全部原因是做一个奇特的颜色变化。如果我使用ASP:按钮onclick处理程序来执行我的导出,它工作正常,我没有遇到任何问题。我不确定问题出在哪里,在使用html按钮和__doPostBack()以及asp按钮onclick事件之间做同样的事情。

答案 4 :(得分:0)

我有同样的问题 - 获取数据的ASP按钮和将其导出到Excel的html按钮。我的解决方案是从ASP按钮“OnClientClick”调用JavaScript来清除__EVENTTARGET值:

OnClientClick="clearEVENTTARGET(); return true;"

function clearEVENTTARGET() {
        this.<form name here>.__EVENTTARGET.value = '';
    };