繁体   English   中英

ASP.NET MVC - 在新标签上有条件地打开PDF /图像

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM