2014-10-20 55 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