gpt4 book ai didi

javascript - Controller 操作触发后将文件保存到本地磁盘,ASP.NET MVC

转载 作者:行者123 更新时间:2023-12-03 10:03:26 26 4
gpt4 key购买 nike

这似乎是一个很受欢迎的问题,尽管我找不到最终的解决方案。

我想在将一些数据写入 Controller 中的数据库后保存.xml文件。我的 View 包含 Html.BeginForm() 并在 Controller 中:

[HttpPost]
public ActionResult Create(StatementModel model)
{
//saving data to db
//...
//tried to save file with Response
string text = model.content;
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Length", text.Length.ToString());
Response.ContentType = "text/plain";
Response.AppendHeader("content-disposition", "attachment;filename=\"test.xml\"");

Response.Write(text);
Response.End();

//redirect is not firing
return RedirectToAction("Companies");
}

这可能是一个坏主意,因为我的重定向不起作用。你能建议其他方法吗?我想我可以在 ajax 提交上使用 jQuery 来处理它。是不是一定要用ajax形式而不是html呢?另外,我找不到在 jQuery 中使用对话框保存文件的脚本。

编辑使用jquery ajax:

<script>
function call() {
var msg = $('form').serialize();
$.ajax({
type: 'POST',
url: '@Url.Action("Create", "Statements")',
data: msg,
success: function (data) {
//not firing
console.log('submitted');
window.location.href = '@Url.Action("Customers", "Statements")';
},
error: function (xhr, str) {
alert(xhr.responseCode);
}
});
}
$("form").submit(function () {
call();
});
</script>
<form method="post" target="_blank"> ... <form>

Controller :

[HttpPost]
public ActionResult Create(StatementModel model)
{
if(ModelState.IsValid)
{
// saving file ...
Response.Write(text);
Response.End();
}
return Json(model, JsonRequestBehavior.AllowGet);
}

现在文件已保存在新窗口中。但我无法在 success 函数中重定向到另一个页面。它没有射击。是不是因为我用的是html形式?那么如果使用ajax形式如何打开新页面?

最佳答案

每个 HTTP 请求只能有一个响应 - 您试图潜入两个响应(文件和页面)。

通常,当您发送“Content-Disposition:附件”HTTP header 时,浏览器将停留在当前页面并弹出文件保存对话框(或自动将文件保存在下载中)。

你将不得不改变你的策略。在新窗口中打开此页面(下载文件)并使用 JavaScript 进行重定向。

已编辑

在 Controller 中,您可以设置响应状态

if(..Success..) 
Response.StatusCode = (int)HttpStatusCode.OK;
else
Response.StatusCode = (int)HttpStatusCode.BadRequest;

使用ajax可以检查状态代码

$.ajax({
//...
success: function(data, textStatus, xhr) {
aler(xhr.status);
},
complete: function(xhr, textStatus) {
alert(xhr.status);
}
});

关于javascript - Controller 操作触发后将文件保存到本地磁盘,ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30475211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com