gpt4 book ai didi

javascript - 如何使用一个 Controller 方法返回 FileResult 和 View

转载 作者:行者123 更新时间:2023-11-28 04:16:30 26 4
gpt4 key购买 nike

我有一个按钮,可以通过在 Controller 中运行保存函数来保存表单。该 Controller 的形式如下:

[HttpPost]
public ActionResult Save(ViewModel model)
{
Save(model);
var newModel = new ViewModel();
return View(Index, newModel);
}

我有一个以下形式的 DownloadFile 函数

public FileResult DownloadReceipt(int reportId)
{
filebytes = CreateFile(reportid);
return File(filebytes, MediaTypeNames.Application.Pdf, "file name");
}

我希望能够允许用户使用第二个函数下载此文件,同时使用第一个函数将用户重定向到索引。单击保存按钮时将调用第一个函数。是否有一种方便的方法可以使用该按钮将文件下载到用户计算机上,同时仍然重定向到所需的 View 。目前下载文件函数没有在任何地方被调用。

最佳答案

Controller 的操作背后有一个名为 HTTP 的协议(protocol)。该协议(protocol)指定每个请求应该是单个响应。因此,在回答您的问题时,不可能对单个请求响应(返回)多个页面。

但是冷静下来,仍然有希望。我们可以伪造这种行为。有很多方法可以伪造它。我将向您展示一个:

Index.cshtml 中,您可以编写对下载页面的调用:

索引.cshtml:

@if((ViewBag.ReportId as int?) > 0)
{
<script type="text/javascript">
var url = "@Url.Action("DownloadReceipt", new { reportId = ViewBag.ReportId })";
window.open(url, "_blank");
</script>
}
<!-- the rest of index code -->

如果您将此代码放入页面中,页面加载后,它将自动调用第二个页面 (DownloadReceipt),而无需关闭实际页面。

要使其正常工作,您现在需要做的就是在操作中设置 ViewBag.ReportId:

[HttpPost]
public ActionResult Save(ViewModel model)
{
Save(model);
var newModel = new ViewModel();
ViewBag.ReportId = 5; // Change 5 for some code that get report id.
return View(Index, newModel);
}

总而言之,如果设置了ViewBag.ReportId,则索引页面将在加载后立即调用下载页面,否则(如果未设置ViewBag.ReportId)则不会将调用下载。

关于javascript - 如何使用一个 Controller 方法返回 FileResult 和 View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45799468/

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