0

在服务器端,我有以下代码:

    protected void DownloadExcel(object sender, EventArgs e)
    {
        byte[] arrayExcel = Convert.FromBase64String(reportBase64.Value);
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.AppendHeader("content-length", arrayExcel.Length.ToString());
        HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=excelName.xls");
        HttpContext.Current.Response.ContentType = "application/Excel";
        HttpContext.Current.Response.BinaryWrite(arrayExcel);
        HttpContext.Current.Response.End();
        HttpContext.Current.Response.Close();
        HttpContext.Current.Response.Flush();
    }

此方法绑定到由这个小 js 触发的“OnValueChanged”事件:

    self.getExcel = function (stringBase64) {
    $("#hiddenFiedlName").val(stringBase64).change();
    __doPostBack();
}

在第一次触发事件后,它会在每次回发时触发。我认为发生这种奇怪的行为是因为 js 代码修改的“更改触发器”没有被真正的回发清除。

现在,我的假设正确吗?如果是这样,有没有办法以编程方式清除这个“更改”触发器?

谢谢

EDIT1:我写的“每个回发”是由同一页面中的其他按钮触发的其他文件下载。

4

1 回答 1

1

这个问题有点棘手,但我设法解决了它。

事实是:如果没有执行真正的回发(不考虑响应文件),该值仍然被认为是 "changed"

解决此问题的唯一方法似乎是手动“重置”隐藏字段的值。

我想出了这个:

self.getExcel = function (stringBase64) {
    $("#hiddenFiedlName").val(stringBase64);
    __doPostBack();
    $("#hiddenFieldName").val("");
}

回发后,值恢复为初始值(始终为空字符串)。这样做不会触发“ValueChanged”事件。

正如 jbl 的评论中所述,这change()是无用的(请参阅他在问题中的评论)。

于 2012-11-28T14:36:55.087 回答