[英]How to open PDF file in a new tab or window instead of downloading it using C# and ASP.NET MVC?
[英]ASP.NET MVC - Conditionally open PDF/Image on new Tab
这里我有一个过滤报告页面,我可以在其中过滤报告的一些信息(RDLC,返回PDF或图像文件)。 今天,这个页面总是在一个新的选项卡上返回文件,因为我使用这个:
@using (Html.BeginForm("Report", "ReportController", FormMethod.Post, new { target = "_blank" }))
我的ReportController返回一个FileContentResult,如下所示:
return File(renderedBytes, mimeType, fileName + "." + fileNameExtension);
但是,此页面有一些服务器端验证,并且回发总是在新创建的选项卡上发生,而不是在单击提交按钮的原始选项卡上。 有没有办法只在ModelState没有错误的情况下返回一个新页面(target =“_ blank”,生成的PDF或Image)? 如果有错误,我想坚持报告过滤页面。
先感谢您。
您可以在两个单独的操作中拆分报告生成。
1.使用新属性扩展您的视图模型Target,Action(这将帮助您改变表单属性)。
[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自动执行第二个表单提交到新的目标操作
@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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.