0

我有一个用 MVC 编写的简单“管理系统”。它适用于电子商务业务,我正在寻找通过一个按钮按下物理打印一批订单的最佳方式。

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

到目前为止,我正在使用 MVC 视图和出色的 Rotativa 将我的视图转换为 PDF 并允许我打印。这仅对单个订单非常有用,但我的要求是一个按钮可以打印所有订单(在给定的过滤器内)。

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

4

1 回答 1

1

我想出了如何使用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>

我希望这对将来的人有所帮助!:)

于 2015-04-03T17:42:36.093 回答