2012-07-26 10 views
5

Moja aplikacja została zrealizowana przy użyciu MVC 3, .net. Próbuję wygenerować plik excel za jednym kliknięciem przycisku. Wywołanie akcji kontrolera odbywa się za pomocą Ajax. Moim głównym problemem jest: Podczas generowania pliku próbuję wyświetlić obraz na ekranie, aby poinformować użytkownika o operacjach. Mogę bardzo dobrze wyświetlić obraz, ale nie mogę go ukryć po zakończeniu operacji. W codei używam jest: KodUkryj obraz przy użyciu Javascript po zakończeniu działania kontrolera MVC3

JavaScript: Kod

$("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; 
}); 

Controller Działanie:

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); 
     } 
} 

nie zwrócić wynik JSON do powołania javascript metoda, gdzie mogę napisać kod do ukryj obraz. Zwracam plik, który może zostać zapisany przez użytkownika i czynność jest zakończona.

Czy ktoś może zasugerować/pomóc mi, jak mogę ukryć obraz po zakończeniu operacji generowania pliku?

Doceń pomoc ...

Odpowiedz

9

Można checkout following article i umieścić to w czyn. Więc zaczynamy od zdefiniowania Kontroler:

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"); 
    } 
} 

aw widzenia:

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

Teraz Ostatnim krokiem jest włączenie jquery.cookie wtyczki:

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

i napisać skrypt do zasubskrybuj zdarzenie kliknięcia zakotwiczenia i śledź postęp pobierania:

$(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

Aby uniknąć problemów z plikami cookie, wolę posługiwać się tym przy użyciu zmiennej sesji. Ustawiasz zmienną sesji po długim kodzie w akcji i używasz podobnego skryptu do odpytywania w twoim js, który wysyła zapytania ajax do innej akcji, która sprawdza, czy sesja istnieje. Jeśli tak się stanie, zabijesz sesję i zwrócisz "prawdziwą" odpowiedź na wywołanie zwrotne js i wyłączysz program ładujący. –

Powiązane problemy