response.writefile(“filename.png”)在通过按钮触发时工作,但在通过回调触发时不起作用

时间:2012-03-05 21:54:05

标签: c# asp.net callback

我有一个应用程序,我想强制下载图像,而不是在浏览器中显示。 response.writefile似乎完成了这个。

但是,如果我从我的ICallBackEvent Handler中以编程方式调用我的方法,则没有任何反应。没有错误,它只是挂起。

通过代码显示该方法运行,但文件没有下载,并且CallBack永远不会完成。我不知道发生了什么。

protected void Button1_Click(object sender, EventArgs e)
{
    downloadtest();
}

public string downloadtest()
{
    string fileName = "";

    string outPath = HttpContext.Current.Server.MapPath("~/images/") + @"logo.png";

    fileName = "logo.png";

    Response.Clear();
    Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
    Response.WriteFile("logo.png");
    Response.End();

    return fileName;
}

因此,如果我点击按钮,效果会非常好。

但是如果我从我的回调代码中调用downloadtest(),则没有任何反应。

感谢您的任何想法。

这是我的回调代码。

它很长,但这里有很大的一块。

服务器端优先......

                String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
                String callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + ";}";
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);

.......

 #region ICallbackEventHandler Members

        string CBResult = string.Empty;

        public string GetCallbackResult()
        {
            return CBResult;
        }

        public void RaiseCallbackEvent(string eventArgument)
        {
            string[] args = eventArgument.Split(',');
            string sessionidvar = args[0];
            string Argument = args[1];

            GeoCollection<Overlay> MapOverlays;

            string statepath = OverlayClass.SetStatePath(sessionidvar);

            CBResult = string.Empty;

            switch (Argument)
.......

case "contribution":

                    downloadtest();
                    CBResult = "contribution";

                    break;

客户端......

function mapHeatLayerLoad(HEATLAYER) {

    var sessionid = $('.logo').attr('data-SessionId');
    var offset = $('#divMap').offset();

    var HTML = "<div id='mapupdatingdiv'><H1>Map Updating...</H1>";
    HTML += "<img id='mapLoaderGif' src='/images/ajax-loader.gif' alt='Image'/>";
    HTML += "</div>";

    $('#divMap').append(HTML);

    CallServer(sessionid + "," + HEATLAYER, "");
}

..........

function ReceiveServerData(rValue) {
    var argArray = rValue.split(',');
    var map = Map1.GetOpenLayersMap();
    var sessionid = $('.logo').attr('data-SessionId');

    var PenetrationLayer = map.getLayer("PenetrationOverlay");
    var ContributionLayer = map.getLayer("ContributionOverlay");
    var PenChangeLayer = map.getLayer("PenChangeOverlay");
    var ConChangeLayer = map.getLayer("ConChangeOverlay");
    var CompetitorLayer = map.getLayer("CompetitorOverlay");
    var HighLightLayer = map.getLayer("HighLightDynamicOverlay");
    var ZipBordersLayer = map.getLayer("ZipBordersOverlay");
    var PSALayer = map.getLayer("PSAOverlay");
    var SSALayer = map.getLayer("SSAOverlay");
    var WaterLayer = map.getLayer("WaterOverlay");
    var HighwaysLayer = map.getLayer("HighwaysOverlay");
    var ASCIconLayer = map.getLayer("ASCIconOverlay");
    var HospitalIconLayer = map.getLayer("HospitalIconOverlay");
    var ASCLayer = map.getLayer("ASCOverlay");
    var HospitalsLayer = map.getLayer("HospitalsOverlay");
    var ClientLayer = map.getLayer("ClientOverlay");

    $('#mapupdatingdiv').fadeOut('slow', function () { $('#mapupdatingdiv').remove(); });

    switch (argArray[0]) {

........


        case "contribution":

            map.getLayer("ContributionOverlay").redraw(true);
            BuildLegend(2);
            break;


......

1 个答案:

答案 0 :(得分:1)

我明白了。我无法通过回调启动Response.xx。我设置了一个隐藏的asp按钮来执行我想要的功能,然后通过回传来从JavaScript中调用它。