这里我有一个过滤报告页面,我可以在其中过滤报告的一些信息(RDLC,返回 PDF 或图像文件)。今天,此页面总是在新选项卡上返回文件,因为我正在使用这个:
@using (Html.BeginForm("Report", "ReportController", FormMethod.Post, new { target = "_blank" }))
我的 ReportController 返回一个 FileContentResult,如下所示:
return File(renderedBytes, mimeType, fileName + "." + fileNameExtension);
但是,此页面有一些服务器端验证,并且回发总是发生在新创建的选项卡上,而不是在单击提交按钮的原始选项卡上。只有当 ModelState 没有错误时,有没有办法返回新页面(target =“_blank”,带有生成的 PDF 或图像)?如果有错误,我想留在报告过滤页面。
提前谢谢你。
最佳答案
您可以将报告生成分成两个单独的操作。
1. 使用新属性 Target、Action 扩展您的 View 模型(这将帮助您动态更改表单属性)。
[HttpGet]
function ActionResult Report()
{
var model = new ReportViewModel{ Target = "_self", DownloadFile = false, Action = "Report" };
return View(model);
}
2.验证您的模型并在模型状态有效的情况下将这些属性设置为新值
[HttpPost]
function ActionResult Report(ReportViewModel model)
{
if (ModelState.IsValid)
{
model.DownloadFile = true;
model.Action = "DownloadReport";
model.Target = "_blank";
return View(model);
}
else
{
// server side error occurred
return View(model);
}
}
3.使用jquery自动执行第二次表单提交到新的目标 Action
@using (Html.BeginForm(Model.Action, "ReportController", FormMethod.Post, new { target = Model.Target, id = "MyForm" }))
{
@Html.HiddenFor(m => m.Action);
@Html.HiddenFor(m => m.Target);
@if(Model.DownloadFile)
{
<script>$(document).ready(function () { $("#MyForm").submit(); }</script>
}
// other form elements
}
3.处理第二个表单提交:
[HttpPost]
function ActionResult DownloadReport(ReportViewModel model)
{
// generate file
return File(renderedBytes, mimeType, fileName + "." + fileNameExtension);
}
关于c# - ASP.NET MVC - 在新选项卡上有条件地打开 PDF/图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26465940/