如何在ASP.NET MVC中的服务器上提供文件之前显示中间页面/消息“生成报告”

时间:2013-12-02 14:39:51

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我是ASP.Net的新手,希望得到您的帮助,

我有一个视图,当用户点击该链接时会显示“Genererate report”,后面的操作被调用

public ActionResult RequestReportGen()
{
        String textFileWithStagedFiles = ReportsHelper.putStagedFilesToTextFile();
        String outputFile = Path.Combine(Constants.SCRATCH_DIR,Constants.REPORTS_DIR_NAME,"test.xlsx");
        String logFile = Path.Combine(Constants.SCRATCH_DIR,Constants.REPORTS_DIR_NAME,"test.log");

         // Start the child process.
         Process p = new Process();
         // Redirect the output stream of the child process.
         p.StartInfo.UseShellExecute = true;

         p.StartInfo.FileName = Constants.EXPORTER_PATH;
         p.StartInfo.WorkingDirectory = Constants.SCRATCH_DIR;
         p.StartInfo.Arguments = String.Format(" -textfile {0} -output {1} -log {2}", textFileWithStagedFiles, outputFile, logFile);

         p.Start();          
         p.WaitForExit();

         return RedirectToAction("Index");
    }

然而,当流程完成时,我必须等待,以便在用户准备好时显示报告。报告生成可能需要几分钟。

当用户点击“生成报告”时,是否可能会调用上述操作,但之后他会被带到一个页面,该页面显示甚至是一个静态页面的动画,该页面显示“正在生成报告”以及我的报告后流程结束我结束中间页面并将用户带到某个报告页面?

2 个答案:

答案 0 :(得分:3)

如果您使用.net 4.5,则可以使用以下异步方式执行此操作,这将允许用户在生成报告时继续使用该站点,并使用ajax而不是单独的页面显示消息。

围绕报告生成处理返回任务创建方法。

作为示例,请参阅以下内容:

private Task RunReport() 
{
    return Task.Run(() => 
              // The below should contain your generate report code
              Thread.Sleep(5000)
     );
}

然后让Action返回一项任务,并在调用报告之前加上await

这将取消阻止UI线程,允许用户在生成报告时继续使用该站点。内容是处理完毕后返回页面的内容。

[HttpPost]
public async Task<ActionResult> RequestReportGen()
{
    await RunReport();
    // Add your link to the report in the content below
    return Content("Report generated!";
}

包括以下javascript库:

<script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

然后使用ajax表单发布到您的方法,请注意LoadingElementId(等待时显示)和UpdatedTargetId(显示完成的消息)。

 @using (Ajax.BeginForm("RequestReportGen", "Home", new AjaxOptions { UpdateTargetId = "result", LoadingElementId="loading" }))
 {
        <div id="loading" style="display:none;">Generating Report...</div>
        <div id="result"></div>
        <input type="submit" />
}

使用上述方法,您的用户仍然可以使用该网站,因为您的UI线程未被阻止,并且在加载和完成时会将消息转发回用户。

答案 1 :(得分:-1)

使用以下Meta标签创建“正在生成报告”页面:

<meta http-equiv="refresh" content="0;URL='http://RequestReportGen/'" />

(where http://RequestReportGen is the url of your RequestReportGen method)

当用户访问此页面时,他们将被重定向到实际的报告页面。但如果加载需要一段时间,那么他们将看到你的加载动画。

您也可以将其放在<noscript></noscript>标签中。然后在页面加载时向RequestReportGen发出Ajax请求,并用生成的报告替换加载图像。