2014-02-19 62 views
0

我在我的視圖中有一個devexpress網格,並且提交按鈕將執行一個操作來導出數據。 如果我不這樣,執行操作並返回我的下載文件:通過Ajax返回Action的結果的錯誤

@using (Html.BeginForm("Export","Product")) 
{ 
    <input type="submit" value="export"/> 
} 

但如果我不提交這樣的:

function OnCommandExecuted(s, e) { 
    if (e.item.name == "SendData") { 
     $.ajax({ 
      url: '/Product/Export' 
     }); 
    } 
} 

的JS調用和正常執行的動作,但它不會返回下載。

我的行動代碼:

[HttpPost] 
    public ActionResult Export() 
    { 
     return GridViewExtension.ExportToXls(CreateExportGridViewSettings(), Session["product"] as List<Product>); 
    } 

我把一個斷點在動作和JavaScript代碼通常調用動作,但它不會返回下載(沒有任何錯誤)。 這裏錯過了什麼?

回答

2

你不應該使用AJAX來下載文件。但是,如果你想使用JQuery AJAX來下載文件,那麼你可以在JQuery中使用window.open()並打開文件資源URL來觸發下載。

讓動作返回JSON數據保持URL到文件資源 -

public ActionResult Download(string fileId) 
    { 
     return new JsonResult(){ Data = "File URL to Download using fileId, probably with some querystrings", JsonRequestBehavior = JsonRequestBehavior.AllowGet}; 
    } 

然後在你的JQuery -

<script src="~/Scripts/jquery-1.10.2.min.js"></script> 
<script> 
    function submitForm() { 
     jQuery.ajax({ 
      type: "POST", 
      url: "@Url.Action("Download")", 
      dataType: "json", 
      contentType: "application/json; charset=utf-8", 
      data: JSON.stringify({ fileId: "123"}), 
      success: function (data) { 
       window.open(data, "_blank"); 
      }, 
      failure: function (errMsg) { 
       alert(errMsg); 
      } 
     }); 
    } 
</script> 

<input type="button" value="Click" onclick="submitForm()" /> 

然後當你點擊按鈕,指向文件的URL會從Action方法返回到JQuery。然後JQuery在新窗口中打開該URL並進行文件下載。

另外,你也可以嘗試像JQuery FileDownload這樣的插件,它提供了下載文件的AJAX體驗。

+0

感謝您的回答,即時通訊使用devexpress功能區組件,並且此功能區中的自定義devexpress按鈕僅允許通過腳本調用操作。那就是爲什麼即時使用它。 – gog