我昨天发布了类似的问题,但我还没有得到结果。我已经在我的kendo网格上加载数据了 点击下载,我想下载文件,但它没有返回结果。我正在下载的文件夹是在服务器上而不是在项目解决方案上。 我创建了一个控制器来测试下载而无需单击按钮,它可以工作,但我想从kendo按钮单击下载。控制台上没有错误
从网格中获取所选ID的功能
function showDetails(e) {
e.preventDefault();
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
DownloadIndexController(dataItem.possID);
}
Ajax调用控制器
function DownloadIndexController(possID) {
$.ajax({
url: '@Url.Action("DownloadIndex", "Poss")',
type: "GET",
data: { possID: possID },
dataType: "json",
success: function (data) {
window.location = '@Url.Action("DownloadIndex", "Poss")';
}
})
}
控制器
public ActionResult DownloadIndex(int possID)
{
string Filelocation = "myserverlocation"
FileContentResult ff = null;
try
{
OnePossModel md = new Models.OnePossModel();
JsonParamBuilder myBuilder = new JsonParamBuilder();
myBuilder.AddParam<Guid>("submittingUserID", System.Guid.Parse(User.Identity.GetUserId()));
myBuilder.AddParam<int>("possID", Convert.ToInt32(possID));
string jsonReq = Models.JsonWrapper.JsonPOST(ApiBaseUrl + ApiPOSSSubBaseUrl + "/WritePOSSFile", myBuilder.GetJSonParam());
string possFilename = Models.DeserialiseFromJson<string>.DeserialiseApiResponse(jsonReq);
possFilename = possFilename.Replace(",", ",");
string x = Filelocation + possFilename.ToString();
var type = System.Net.Mime.MediaTypeNames.Application.Octet;
byte[] fileBytes = System.IO.File.ReadAllBytes(x);
string myfileName = possFilename;
ff = File(fileBytes, type,myfileName);
Response.AppendHeader("Content-Disposition", "attachment; filename=" + myfileName);
Response.BinaryWrite(fileBytes);
return ff;
}
catch (Exception ex)
{
throw ex;
}
}
答案 0 :(得分:0)
在你的控制器中,只需添加:
public FileResult DownloadIndex(int possID)
{
. . . .
return File(fileBytes, type,myfileName);
}
答案 1 :(得分:0)
我认为不能按照你想要的方式完成。看看here的解决方法,以模拟“ajax文件下载”。
在您的代码中,您正在发出2个请求,第一个创建文件并在响应中流式传输(并且无法使用ajax下载),然后通过设置window.location来设置第二个请求 - 但文件不是“ “因为它被分配给了第一个回复,所以还活着。”
如果使用FileResult
操作然后放弃ajax调用(取决于您的要求),只需使用普通链接:/poss/downloadindex/123