阻止ActionResult发布到新页面?

时间:2011-05-19 13:02:56

标签: asp.net-mvc pdf-generation

我的项目与NerdDinner非常相似,我正在使用PdfSharp生成pdf文档。

在我看来,我正在使用它:

<%: Html.ActionLink("Pdf", "GeneratePdf1", "Persons")%>

调用此ActionResult:

    public ActionResult GeneratePdf1()
    {
        // Create a new PDF document
        PdfDocument document = new PdfDocument();
        document.Info.Title = "Created with PDFsharp";

        // Create an empty page
        PdfPage page = document.AddPage();

        // Get an XGraphics object for drawing
        XGraphics gfx = XGraphics.FromPdfPage(page);

        // Create a font
        XFont font = new XFont("Verdana", 20, XFontStyle.BoldItalic);

        // Draw the text
        gfx.DrawString("Hello, World!", font, XBrushes.Black,
        new XRect(0, 0, page.Width, page.Height),
        XStringFormats.Center);

        // Save the document...
        const string filename = "HelloWorld.pdf";
        document.Save(filename);
        Process.Start(filename);
        return View();
    }  

关于此问题的几个问题:

  • 我不想发布链接。当您单击该链接时,它应该只打开该文件,但我不知道要返回什么以防止它发布。
  • 我也想要显示“保存/打开”对话框。现在直接显示pdf文件。

2 个答案:

答案 0 :(得分:4)

您想要返回FileResult而不是ActionResult。另外,我会将它保存到MemoryStream并返回字节数组,而不是使用文件。完整解决方案如下。

public FileResult GeneratePdf1()
{
    // Create a new PDF document
    PdfDocument document = new PdfDocument();
    document.Info.Title = "Created with PDFsharp";

    // Create an empty page
    PdfPage page = document.AddPage();

    // Get an XGraphics object for drawing
    XGraphics gfx = XGraphics.FromPdfPage(page);

    // Create a font
    XFont font = new XFont("Verdana", 20, XFontStyle.BoldItalic);

    // Draw the text
    gfx.DrawString("Hello, World!", font, XBrushes.Black,
    new XRect(0, 0, page.Width, page.Height),
    XStringFormats.Center);


    MemoryStream stream = new MemoryStream();
    document.Save(stream, false);

    return File(stream.ToArray(), "application/pdf");
}

答案 1 :(得分:2)

你应该替换这些行:

Process.Start(filename);
return View();

return File(filename, "application/pdf");

如果下载的文件名与操作名称不同,您可能还有第三个参数。

return File(filename, "application/pdf", "myGeneratedPdf.pdf");

另外,请确保每个请求的文件名都是唯一的,或使用像Chris Kooken建议的MemoryStream

顺便说一句:Process.Start(filename)将在服务器计算机上运行该文件。这可能适用于您的开发机器,但在实时服务器上,pdf将在服务器上打开!!!