2015-04-03 56 views
0

我有一个用MVC编写的简单'管理系统'。这是一个电子商务业务,我正在寻找最佳的方式,通过一个按钮按下来物理打印一批订单。使用MVC中的给定模板批量打印多个订单

该系统目前是MVC5,并使用ASP.Net Web API获取订单数据。我的API可以轻松地返回我想要的订单。但我的问题是如何使用特定模板打印订单集合。

到目前为止,我使用MVC视图和优秀的Rotativa将我的视图转换为PDF,允许我打印。这对于单个订单来说确实很好,但我的要求是打印所有订单的一个按钮(在给定的过滤器中)。

关于如何解决这个问题的任何想法?

回答

0

我想出了如何使用Rotativa来做到这一点。

Rotativa尊重CSS的'page-break-after'属性,所以使用这个,你可以在你的视图中添加一个分页符,只要你想分页,因此允许在视图中使用foreach循环来枚举订单。

在我的控制器中,我有以下操作来响应“全部打印”按钮。高度和宽度的测量涉及到标准尺寸的A4纸:

public ActionResult Print() 
    { 
     var r = new ActionAsPdf("IndexPrintFormat") 
     { 
      FileName = DateTime.Now.ToShortDateString()+".pdf", 
      PageSize = Rotativa.Options.Size.A4, 
      PageOrientation = Rotativa.Options.Orientation.Portrait, 
      PageHeight = 297, 
      PageWidth = 210 
     }; 

     return r; 
    } 

我的控制器还具有所谓的“IndexPrintFormat”的动作这使得我想打印的实际的视图。此列举的订单的集合,并且每个订单之后添加它使用以下CSS为P

 .breakhere { 
     display: block; 
     clear: both; 
     page-break-after: always; 
    } 

的P是如下

<p class="breakhere"></p> 

整个“IndexPrintFormat”视图大致如下(削减在这里以达到这一点)

@model <MyViewModelPathGoesHere> 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 
<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <style> 
     .breakhere { 
      display: block; 
      clear: both; 
      page-break-after: always; 
     } 
    </style> 
</head> 
<body> 
    @foreach (var order in Model.Orders) 
    { 
     <div> 
//display whatever you want to display for each order here 

//This causes a new page in the PDF 
      <p class="breakhere"></p> 
     </div> 
    } 
</body> 
</html> 

我希望这可以帮助未来的人! :)