2012-07-26 24 views
5

Uygulamam MVC 3, .net kullanılarak gerçekleştirilmiştir. Bir düğmeye tıklama ile bir excel dosyası oluşturmaya çalışıyorum. Denetleyici eylemine yapılan çağrı Ajax kullanılarak yapılır. Başlıca sorunum: Dosya oluşturma sırasında, kullanıcının devam eden işlemi bilmesi için ekranda bir görüntü göstermeye çalışıyorum. Görüntüyü çok iyi görüntüleyebilirim ancak işlem tamamlandıktan sonra gizleyemiyorum. codei kullanıyorum geçerli:Denetleyici eylemi tamamlandıktan sonra Javascript'i kullanarak görüntüyü gizleme MVC3

Javascript kodu:

$("input.DownloadExcelReport").click(function (e) { 
    e.preventDefault(); 
    var parameter = -- code to fetch parameter value; 
    var outputViewUrl = (the url is created here); 
    showLoading(); -- This function displays the image 
    window.location.href = outputViewUrl; 
}); 

Kontrolör Eylem kodu:

public ActionResult DownExcelReportForAssortment(Guid parameter) 
{ 

     try 
     { 

      //the contents for the file generation are fetched here.. 
      // Write contents to excel file 
      if (memoryStream != null) 
      { 
       var documentName = "Report.xls"; 
       byte[] byteArrary = memoryStream.ToArray(); 
       return File(byteArrary, "application/vnd.ms-excel", documentName); 
      } 
     } 
     catch (Exception ex) 
     { 
      LogManager.LogException(ex); 
     } 
} 

Ben kodu yazabilirsiniz javascript yöntem çağrısı için Json sonuç döndürmüyor resmi sakla. Kullanıcı tarafından kaydedilebilecek bir dosya döndürüyorum ve işlem tamamlandı.

Dosya üretme işlemi tamamlandığında görüntüyü nasıl gizleyebilirim?

yardım için teşekkür ederiz

...

cevap

9

Sen following article ödeme edebilir ve eyleme koymak. Yani bir denetleyici tanımlayarak başlamak:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult DownExcelReportForAssortment(Guid parameter, string tokenId) 
    { 
     // Simulate some heavy work to fetch the report 
     Thread.Sleep(5000); 

     // we fake it 
     byte[] byteArray = System.IO.File.ReadAllBytes(@"c:\test.xls"); 

     var cookie = new HttpCookie("fileDownloadToken", tokenId); 
     Response.AppendCookie(cookie); 

     return File(byteArray, "application/vnd.ms-excel", "report.xls"); 
    } 
} 

ve görünümde:

@Html.ActionLink(
    "download report", 
    "DownExcelReportForAssortment", 
    "Home", 
    new { parameter = Guid.NewGuid(), tokenId = "__token__" }, 
    new { @class = "download" } 
) 

Şimdi son adımdır

jquery.cookie eklentisi içerecek şekilde:

<script type="text/javascript" src="@Url.Content("~/scripts/jquery.cookie.js")"></script> 

ve bir senaryo yazmaya bağlantı noktasının tıklama etkinliğine abone olun ve indirme ilerlemesini izleyin:

$(function() { 
    var fileDownloadCheckTimer; 

    $('.download').click(function() { 
     var token = new Date().getTime(); 
     $(this).attr('href', function() { 
      return this.href.replace('__token__', token); 
     }); 

     // Show the download spinner 
     $('body').append('<span id="progress">Downloading ...</span>'); 

     // Start polling for the cookie 
     fileDownloadCheckTimer = window.setInterval(function() { 
      var cookieValue = $.cookie('fileDownloadToken'); 
      if (cookieValue == token) { 
       window.clearInterval(fileDownloadCheckTimer); 
       $.cookie('fileDownloadToken', null); 

       // Hide the download spinner 
       $('#progress').remove(); 
      } 
     }, 1000); 
    }); 
}); 
+0

Çerez sorunlarından kaçınmak için, bunu bir oturum değişkeni kullanarak ele almayı tercih ediyorum. Böylece, Eylem Değişkenini eyleminizdeki uzun süren koddan sonra ayarlarsınız ve jsinizde benzer bir yoklama komut dosyası kullanırsınız, bu da ajax isteklerini oturumu denetleyip kontrol etmediğini kontrol eden başka bir eyleme gönderir. Eğer yaparsa, oturumu öldürür ve js geri çağırmasına 'gerçek' bir cevap verir ve yükleyicinizi kapatırsınız. –

İlgili konular