首页 > 解决方案 > .Net Core MVC - TempData 不在 AJAX 调用中本地保存数据

问题描述

这确实对我有用。我没有更改该区域周围的代码,现在它不起作用。

我有一个 .net core 2.2 MVC Web 应用程序,当用户想要下载文件(word 文档,60KB 大小)时,它会触发 AJAX 调用。AJAX 调用触发我的HTTPPost控制器方法,该方法检索文件并将其存储到TempData.

我的 AJAX 调用的成功回调然后触发一个HTTPGET控制器方法,该方法从 TempData 读取并将文件发送回用户下载。它在此方法中 TempData 为空。我在 iis express 本地运行它

AJAX 调用代码:

                $.ajax({
                    url: "/Home/DownloadFileAJAX",
                    type: "POST",
                    data: { data: downloadUrl },
                    dataType: "json",
                    success: function (result) {
                        if (result == "success") {                                   
                            var filepath = JSON.stringify(result);
                            alert('Successfully called' + filepath);                                    
                            location.href = '@Url.Action("ActuallyDownloadFile", "Home")';                                 
                        }
                    },
                    error: function (result) {
                        if (result == "failed")
                            alert('Failed' + result);
                        alert("An error has occured in ajax call!" + JSON.stringify(result));
                    }
                });

我的 AJAX 调用触发的第一个控制器方法:

[HttpPost]   
public async Task<IActionResult> DownloadFileAJAX(string data)
{
    string code = "";
    string toBeSearched = _configuration.GetValue<string>("ReferralDownloadSearchParameter");         
    int ix = data.IndexOf(toBeSearched);

    if (ix != -1)
    {
        code = data.Substring(ix + toBeSearched.Length);
    }

    var referralUploadPath = _configuration.GetValue<string>("ReferralFormLocation");
    var path = string.Concat(referralUploadPath, "", code);

    var memory = new MemoryStream();
    using (var stream = new FileStream(path, FileMode.Open))
    {
        await stream.CopyToAsync(memory);
    }
    memory.Position = 0;

    TempData["ReferralOutput"] = memory.ToArray();
    TempData["FileName"] = code;
    return Json("success", new Newtonsoft.Json.JsonSerializerSettings());       

}

我的 AJAX 调用触发的第二个控制器方法:

[HttpGet]
public ActionResult ActuallyDownloadFile()
{
    // retrieve byte array here
    var filenameReferral = TempData["FileName"];
    var array = TempData["ReferralOutput"] as byte[];
    if (array != null)
    {                
        return File(array, "application/vnd.openxmlformats-officedocument.wordprocessingm", filenameReferral.ToString());                
    }
    else
    {
        return new EmptyResult();
    }
}

在运行时显示值的屏幕截图:

https://imgur.com/a/fEXZ4zr

知道发生了什么吗?

谢谢

标签: jqueryajaxasp.net-core-mvc

解决方案


根据您的代码,我在我这边创建了一个测试演示,效果很好。据我所知,临时数据默认存储在cookie中。如果您禁用 cookie 或匹配 cookie 限制。它不会很好地工作。

大多数浏览器将 cookie 大小限制为 4096 字节。每个域只能使用有限数量的 cookie。

我建议您可以尝试使用 AddSessionStateTempDataProvider 让临时数据存储到会话而不是 cookie 中。

注意:会话仍然需要启用 cookie,因为会话 id 存储在 cookie 中。

有关如何启用 AddSessionStateTempDataProvider 的更多详细信息,您可以参考以下代码:

配置服务方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews()
        .AddSessionStateTempDataProvider();

    services.AddSession();
}

配置方法:

添加 app.UseSession();

结果如下:

在此处输入图像描述


推荐阅读