下载带有 Knockout 绑定、ASP.NET MVC 堆栈且没有 Razor 的文件

Downloading a file with Knockout bindings, ASP.NET MVC stack and no Razor

正在尝试找到可以为我指明正确方向的资源,以下载具有此特定堆栈的文件。这比看起来更具挑战性,尤其是因为我无法按照内部规则使用 Razor。

代码执行可以从标记到敲除,然后是 C#,但它不会像我在普通 webforms 非 MVC 中期望的那样开始下载 ASP.NET。

加价:

<div class="row">
    <div class="col-2"><img data-bind="attr: {src: image}, click: $root.downloadFile/></div>

knockout/javascript 调用:

self.downloadFile = function(e){
    if(e) {
        attachmentId = e.id;
        helpers.ajax.getJson(root, "/Files/DownloadFile/", {fileId: attachmentId }, function(x){
        attachmentId=0;
        getFiles();
        });
}

... 此处调用的相关 javascript 函数:

helpers.ajax.getJson = function(path, url, data, onSuccess, onError){
    helpers.ajax.async('GET', path, url, {
        data: data,
        cache: false,
        async: true,
        error: onError,
        success: onSuccess
    });
};

function getFiles(){
    self.files([]);
    helpers.ajax.getJson(root, "/Files/GetFiles",
    { profileId: self.ProfileId() },
    function (files) {
        if(files) {
        $.each(files, function (i, v) {
            self.files().push(new file(v.AttachmentId, v.FileTypeDescr, v.FileExtension, v.FileName, v.UploadedBy, v.UploadDate, v.CompletionDate));
        self.files.valuehasMutated();
        });
    }
});

}

C#

public FileResult DownloadFile(int fileId)
{
    ODSAPI.AttachmentFile file = FileFunctions.GetById(fileId); 
    if(file != null)
    {
        return File(file.FileData, file.ContentType);
    }
    return null;
}

这是我单步执行代码并查看文件变量时 returns 正确的文件信息和数据库中的位。

您可以使用 http://danml.com/download.html 从 javascript AJAX return

下载文件

例如

     download(data, 'Export.csv', 'application/csv');

其中数据将来自您的 ajax 请求以及文件名和文件类型 return。

Javascript 中的 JSON 调用不正确,因为它调用了 JSON 对象。相反,它应该是:

window.open(root + "/Files/DownloadFile?fileId=" + attId, '_blank');

而不是helpers.ajax.getJson()