Javascript 如何使用一个控制器方法返回FileResult和视图

Javascript 如何使用一个控制器方法返回FileResult和视图,javascript,c#,asp.net-mvc,asp.net-mvc-5,Javascript,C#,Asp.net Mvc,Asp.net Mvc 5,我有一个按钮,通过在控制器中运行save函数来保存表单。此控制器的形式如下: [HttpPost] public ActionResult Save(ViewModel model) { Save(model); var newModel = new ViewModel(); return View(Index, newModel); } 我有一个下载文件的函数 public FileResult DownloadReceipt(int reportId) { fil

我有一个按钮,通过在控制器中运行save函数来保存表单。此控制器的形式如下:

[HttpPost]
public ActionResult Save(ViewModel model)
{
   Save(model);
   var newModel = new ViewModel();
   return View(Index, newModel); 
}
我有一个下载文件的函数

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

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

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

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

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

Index.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 -->

如果设置了
ViewBag.ReportId
,则索引页在加载后会自动调用下载页,否则(如果未设置
ViewBag.ReportId
),则不会调用下载。

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

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

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

Index.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 -->

如果设置了
ViewBag.ReportId
,索引页将在加载后自动调用下载页,否则(如果未设置
ViewBag.ReportId
),将不会调用下载。

您不能同时返回视图和文件。您可以返回带有下载文件链接的视图,或通过javascript调用下载。在
onsuccess
中重定向?您不能同时返回视图和文件。您可以返回一个带有下载文件链接的视图,或者通过javascript调用下载。在
onsuccess
中重定向?