2017-08-21 26 views
1

我有一个按钮,它通过在控制器中运行保存功能来保存表单。该控制器的形式为:如何使用一种控制器方法返回FileResult和View

[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"); 
} 

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

+1

您无法同时返回视图和文件。您可以通过链接返回视图以下载文件,或者通过javascript调用下载。 – DavidG

+0

在'onsuccess'内重定向? –

回答

0

控制器的操作后面有一个名为HTTP的协议。该协议为每个请求指定应该是单个响应。因此,在回答您的问题时,无法将多个页面回复(返回)到单个请求。

但冷静下来,仍然有希望。我们可以伪造这种行为。有很多方法来伪造它。

@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 --> 

如果您在页面中把这个代码,很快我会告诉你一个:

在你Index.cshtml你可以写下载页面调用:

Index.cshtml页面加载时,它会在不关闭页面的情况下调用第二页(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设置索引页将altomatically一旦它加载调用下载页面,否则(如果没有设置ViewBag.ReportId)将不会进行呼叫下载。

相关问题