[英]MVC Stream outputting to HTML div
这里是MVC应用程序的一个小问题,我不确定该如何解决。
基本上,我要向最初由其他人(c#)创建的系统添加其他功能。 对于报告系统,结果仅显示在屏幕上。 现在,我正在构建该功能,以允许用户将其报告下载为Excel文档。
因此,基本上,我有一个向用户显示日期范围和其他一些搜索优化选项的视图。 我介绍了一个单选按钮,如果选中该按钮,将下载报告,而不是在屏幕上显示报告。
这是我在ReportController中执行的三个操作:
public ActionResult Index()
{
return View();
}
public ActionResult ProductReport(AdminReportRequest reportRequest, FormCollection formVariables)
{
AdminEngine re = new AdminEngine();
if (!reportRequest.Download)
{
AdminReport report = re.GetCompleteAdminReport(reportRequest);
return View(report);
}
Stream ExcelReport = re.GetExcelAdminReport(reportRequest);
TempData["excelReport"] = ExcelReport;
return RedirectToAction("ExcelProductReport");
}
public FileResult ExcelReport()
{
var ExcelReport = TempData["excelReport"] as Stream;
return new FileStreamResult(ExcelReport, "application/ms-excel")
{
FileDownloadName = "Report" + DateTime.Now.ToString("MMMM d, yyy") + ".xls"
};
}
我已经通过AdminEngine进行了调试,一切看起来都很好。 但是,在ExcelReport动作中,要返回文件-不会。 我看到的是屏幕上有很多字符(在“ panelReport” div中-见下文),与excel文件中的数据混合在一起。
我想我已经确定它在屏幕上显示的原因是某些代码的结果
在“索引”视图中编写的:
<% using (Ajax.BeginForm("ProductReport", "Report", null,
new AjaxOptions
{
UpdateTargetId = "panelReport",
InsertionMode = InsertionMode.Replace,
OnSuccess = "pageLoaded",
OnBegin = "pageLoading",
OnFailure = "pageFailed",
LoadingElementId = ""
},
new { id = "SearchForm" })) %>
如您所见,Ajax.BeginForm语句指出它应该更新为panelReport div-这就是它所做的(通过Product Report部分视图)。 虽然这非常适合需要在屏幕上显示报告的情况,但显然它不适用于excel文件。
有没有解决此问题的方法,而无需过多更改现有代码?
如果需要了解情况,这是我处理excel文件的类:
报告类别:
public Stream GetExcelAdminReport(AdminReportRequest reportRequest)
{
AdminReport report = new AdminReport();
string dateRange = null;
List<ProductSale> productSales = GetSortedListOfProducts(reportRequest, out dateRange);
report.DateRange = dateRange;
if (productSales.Count > 0)
{
report.HasData = true;
CustomisedSalesReport CustSalesRep = new CustomisedSalesReport();
Stream SalesReport = CustSalesRep.GenerateCustomisedSalesFile(productSales);
return SalesReport;
}
}
工种:
public class CustomisedSalesReport
{
public Stream GenerateCustomisedSalesFile(List<ProductSale> productSales)
{
MemoryStream ms = new MemoryStream();
HSSFWorkbook templateWorkbook = new HSSFWorkbook();
HSSFSheet sheet = templateWorkbook.CreateSheet("Sales Report");
//Workings
templateWorkbook.Write(ms);
ms.Position = 0;
return ms;
}
}
这个问题非常明显,因为您正在使用Ajax表单下载文件。 最重要的是,您正在使用内置的Microsoft Ajax库,该库似乎还不够智能。
我可以提供2个解决方案:
最简单的解决方案(我过去使用过)是,您自己创建一个excel文件并将其保存在服务器上,然后将下载链接发送给用户,而不是自己亲自传输文件。 它不需要对代码进行大量更改。
您可以处理AjaxForm的OnSubmit事件,看看它是否是要下载的文件。 如果是,则发出完整的回发请求(使用$.post()
)。 这样,浏览器将自动弹出对话框,询问下载位置。
希望有道理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.