2012-03-05 106 views
0

我有一個應用程序,我想強制下載圖像,而不是在瀏覽器中顯示。 response.writefile似乎完成了這一點。response.writefile(「filename.png」)在通過按鈕觸發時有效,但不是在通過回調觸發時觸發

但是,如果我從我的ICallBackEvent處理程序中編程調用我的方法,則不會發生任何事情。沒有錯誤拋出,它只是掛起。

通過代碼的變通顯示該方法運行,但該文件不下載,並且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

向我們顯示您的回撥代碼? – egrunin 2012-03-05 21:57:45

+0

當你通過回調調用你的方法時,它是否真的進入downloadtest()? – 2012-03-06 14:47:08

+0

回調到服務器上的一段代碼,從這裏執行downloadtest()。 – eshepard 2012-03-06 21:19:16

回答

1

我想通了。我無法從回叫中啓動Response.xx。我設置了一個隱藏的asp按鈕,執行我想要的功能,然後通過回發從JavaScript調用該按鈕。