【问题标题】:Capture MVC View from controller从控制器捕获 MVC 视图
【发布时间】:2015-10-14 18:56:35
【问题描述】:

如何从控制器获取视图?我正在尝试将页面转换为图像并使用webclientPrint 将图像发送到热敏打印机。

我不能使用window.print();,因为热敏打印机可能不接受数据,而且我也不想向用户显示打印机对话框。

评论

我想捕获整个网页并将其转换为图像。

  function Printlabel() {
        debugger
        if (navigator.appName == "Microsoft Internet Explorer") {
            var PrintCommand = '<object ID="PrintCommandObject" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>';
            document.body.insertAdjacentHTML('beforeEnd', PrintCommand);
            PrintCommandObject.ExecWB(6, -1); PrintCommandObject.outerHTML = "";
        }
        else {
            var contents = document.getElementById("PrintArea").innerHTML;
            var frame1 = document.createElement('iframe');
            frame1.name = "frame1";
            frame1.style.position = "absolute";
            frame1.style.top = "-1000000px";
            document.body.appendChild(frame1);
            var frameDoc = frame1.contentWindow ? frame1.contentWindow : frame1.contentDocument.document ? frame1.contentDocument.document : frame1.contentDocument;
            frameDoc.document.open();
            frameDoc.document.write('<html><head><title></title>');
            frameDoc.document.write('<link rel="stylesheet" type="text/css" href="/Styles/labelStyle.css" media="print">');
            frameDoc.document.write('</head><body>');
            frameDoc.document.write(contents);
            frameDoc.document.write('</body></html>');
            frameDoc.document.close();
            setTimeout(function () {
                window.frames["frame1"].focus();
                window.frames["frame1"].print();
                document.body.removeChild(frame1);
            }, 500);
        }
        setTimeout("window.open('', '_self', ''); window.close();", 5000);
        return false;
    }

【问题讨论】:

  • 我担心这缺乏足够的细节来回答。
  • 我想问的是,我想在控制器中捕获整个页面布局和内容并将其转换为 pdf 文件。类似于打印屏幕。
  • 我认为你所追求的不是你在 JavaScript 中所做的——你需要一个浏览器扩展或使用像 phantomJS 这样的无头浏览器来为你生成屏幕截图。跨度>
  • 也就是说,我只是注意到您想要页面的图像?!从服务器端这是不可能的。您无法截屏视图/HTML 有效的文本。浏览器将此文本呈现为您可以看到的内容,它是一种标记语言。您需要以某种方式渲染文本,然后将此渲染转换为图像,我看不出这怎么可能
  • 您可以将视图呈现为字符串,然后转换为 pdf 并将其发送到打印机。捕获为图像没有实际意义,因为它取决于浏览器/主机(例如,移动设备 vs 40" 显示器,即 vs gc vs ff)。看看这里:stackoverflow.com/questions/1403167/…

标签: javascript c# asp.net-mvc


【解决方案1】:

是的,你可以,从控制器传递 ActionResult 并从视图中获取 html 作为字符串,使用这种方法:

    private string RenderActionResultToString(ActionResult result)
    {
        // Create memory writer.
        var sb = new StringBuilder();
        var memWriter = new StringWriter(sb);

        // Create fake http context to render the view.
        var fakeResponse = new HttpResponse(memWriter);
        var fakeContext = new HttpContext(System.Web.HttpContext.Current.Request,
            fakeResponse);
        var fakeControllerContext = new ControllerContext(
            new HttpContextWrapper(fakeContext),
            this.ControllerContext.RouteData,
            this.ControllerContext.Controller);
        var oldContext = System.Web.HttpContext.Current;
        System.Web.HttpContext.Current = fakeContext;

        // Render the view.
        result.ExecuteResult(fakeControllerContext);

        // Restore old context.
        System.Web.HttpContext.Current = oldContext;

        // Flush memory and return output.
        memWriter.Flush();
        return sb.ToString();
    }

【讨论】:

  • 据我了解,这不会捕捉到 css 的风格。
  • 我用它来生成.pdf,结果甚至包含样式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多