2014-10-20 35 views
3

这里我有一个过滤报告页面,我可以在其中过滤报告的某些信息(RDLC,返回PDF或图像文件)。如今,这个页面返回文件总是新鲜的标签,因为我使用的是这样的:ASP.NET MVC - 有条件地在新标签上打开PDF /图像

@using (Html.BeginForm("Report", "ReportController", FormMethod.Post, new { target = "_blank" })) 

和我ReportController返回FileContentResult,如下图所示:

return File(renderedBytes, mimeType, fileName + "." + fileNameExtension); 

然而,这个页面有一些服务器端验证,并且回发总是在新创建的选项卡上发生,而不是在单击提交按钮的原始选项卡上。只有在ModelState没有错误的情况下,是否有返回新页面的方法(target =“_blank”,带有生成的PDF或图像)?如果出现错误,我想坚持在报告过滤页面上。

预先感谢您。

回答

2

你可以用两个分开的动作来分隔你的报表生成。

1.用新属性扩展你的视图模型Target,Action(这会帮助你改变你的表单属性)。

[HttpGet] 
    function ActionResult Report() 
    { 
     var model = new ReportViewModel{ Target = "_self", DownloadFile = false, Action = "Report" };  
     return View(model); 
    } 

2.Validate模型和有效模型状态的情况下,设置这些属性为新值

[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.Handle第二表单提交:

[HttpPost] 
function ActionResult DownloadReport(ReportViewModel model) 
{ 
    // generate file 
    return File(renderedBytes, mimeType, fileName + "." + fileNameExtension); 
} 
+0

感谢您回答@MajoB。我会检查一下。 – 2014-10-21 12:01:55