Javascript ASP.NET核心剃须刀页面从AJAX Post下载文件

Javascript ASP.NET核心剃须刀页面从AJAX Post下载文件,javascript,jquery,ajax,asp.net-core,Javascript,Jquery,Ajax,Asp.net Core,您好,我在使用AJAX帖子从ASP.NET Core Razor页面下载文件时遇到问题。我想做的事情似乎重复地简单,但已经被证明是一个真正的痛苦 我不想将文件存储在服务器上,但如果需要,我可以使用TempData和guid 我想写一篇ajax文章,因为我正在从客户端发送数据来构建文件 发送到服务器的数据将被加密为字符串,该字符串将成为文件的内容。(注意:加密已在工作) 我希望该文件作为我自己的扩展名*.dat下载 下面是我的asp.net核心razor post方法 public IAc

您好,我在使用AJAX帖子从ASP.NET Core Razor页面下载文件时遇到问题。我想做的事情似乎重复地简单,但已经被证明是一个真正的痛苦

  • 我不想将文件存储在服务器上,但如果需要,我可以使用TempData和guid

  • 我想写一篇ajax文章,因为我正在从客户端发送数据来构建文件

  • 发送到服务器的数据将被加密为字符串,该字符串将成为文件的内容。(注意:加密已在工作)

  • 我希望该文件作为我自己的扩展名*.dat下载

  • 下面是我的asp.net核心razor post方法

    public IActionResult OnPostDownloadEncryptedFile([FromBody] List<FileData> fileData)
        {
            var response = ...THIS IS A REST WEB API CALL ASYNC I am calling .Result
           
            var byteArray = Encoding.ASCII.GetBytes(response.EncryptedData);
            var stream = new MemoryStream(byteArray);
    
            return this.File(stream, System.Net.Mime.MediaTypeNames.Application.Octet, "myfile.dat");
        }
    
    我意识到ajax帖子很可能是不完整和错误的,我不太确定如何修复我见过其他人使用window.location,但我不确定这是如何工作的。自从调试以来,我一直无法进入ajax post success函数


    任何帮助都将不胜感激。

    我让它工作起来了,但我觉得这是一个糟糕的实现

    以下是我所做的:

    public IActionResult OnPostEncryptFileData([FromBody] List<FileDataItem> fileData)
        {
            var response = this.restEndpoint.EncryptFileData(
                new FileDataEncryptionRequest()
                {
                    FileDataListItems = new FileDataList() { FileDataItems = fileData.ToList() }
                }).Result;
    
            return new JsonResult(response.EncryptedData);
        }
    
        public FileResult OnGetDownloadEncryptedFile(string data)
        {
            var byteArray = Encoding.ASCII.GetBytes(data);
            return this.File(byteArray, "text/plain", "test.dat");
        }
    

    我很想听到一些更好的解决方案。

    我让它工作了,但我觉得这是一个糟糕的实现

    以下是我所做的:

    public IActionResult OnPostEncryptFileData([FromBody] List<FileDataItem> fileData)
        {
            var response = this.restEndpoint.EncryptFileData(
                new FileDataEncryptionRequest()
                {
                    FileDataListItems = new FileDataList() { FileDataItems = fileData.ToList() }
                }).Result;
    
            return new JsonResult(response.EncryptedData);
        }
    
        public FileResult OnGetDownloadEncryptedFile(string data)
        {
            var byteArray = Encoding.ASCII.GetBytes(data);
            return this.File(byteArray, "text/plain", "test.dat");
        }
    
    我想听听更好的解决办法

    $.ajax({
            type: "POST",
            url: "/MySite/MyPage?handler=EncryptFileData",
            beforeSend: function (xhr) { xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val()); },
            data: JSON.stringify(fileData),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                alert(response);
                window.location = "/MySite/MyPage?handler=DownloadEncryptedFile&data=" + response;
            },
            failure: function (response) {
                alert(response);
            }
        });