Предотвратить публикацию ActionResult на новой странице? - PullRequest
0 голосов
/ 19 мая 2011

Мой проект очень похож на NerdDinner , и я создаю pdf-документ с использованием PdfSharp.

На мой взгляд, я использую это:

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

Вызов этого результата действия:

    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 ]

4 голосов
/ 19 мая 2011

Вы хотите вернуть 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");
}
2 голосов
/ 19 мая 2011

вы должны заменить эти строки:

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

на

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

У вас также может быть третий параметр с загруженным именем файла, если он должен отличаться от имени действия.

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

Также убедитесь, что имя файла является уникальным для каждого запроса, или используйте MemoryStream, как это предложено Крисом Кукеном.

Кстати: Process.Start(filename) запустит файл на серверемашина.это может работать на вашей машине разработки, но на живом сервере PDF откроется на сервере !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...