jquery - .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();
}
}
在运行时显示值的屏幕截图:
知道发生了什么吗?
谢谢
解决方案
根据您的代码,我在我这边创建了一个测试演示,效果很好。据我所知,临时数据默认存储在cookie中。如果您禁用 cookie 或匹配 cookie 限制。它不会很好地工作。
大多数浏览器将 cookie 大小限制为 4096 字节。每个域只能使用有限数量的 cookie。
我建议您可以尝试使用 AddSessionStateTempDataProvider 让临时数据存储到会话而不是 cookie 中。
注意:会话仍然需要启用 cookie,因为会话 id 存储在 cookie 中。
有关如何启用 AddSessionStateTempDataProvider 的更多详细信息,您可以参考以下代码:
配置服务方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews()
.AddSessionStateTempDataProvider();
services.AddSession();
}
配置方法:
添加 app.UseSession();
结果如下:
推荐阅读
- bluetooth - 当您无法访问官方 GATT XML 文件时,如何构建 BLE 应用程序?
- cmd - 如何向上移动多个文件夹
- powerbi - 将自定义属性设置为 power bi 嵌入式中的视觉对象
- android - Flutter 应用程序在打开 razorpay 结帐时崩溃,出现无法启动 checkoutActivity 的错误
- c++ - 在 ctre phoenix 的 ctre::phoenix::platform::can::SetCANInterface 函数中使用的适当 CAN 接口字符串是什么
- typescript - apollo-server-express、apollo-server 和 apollo-cache-control 中的 TypeScript 导入问题
- javascript - D3.json函数只返回部分json文件数据
- openapi - 是否可以在 OpenAPI 3 中引用单个路径和方法?
- python - Python:discord.py 1.5.1 get_user 函数总是返回 None
- regex - 正则表达式给出错误的结果