Wie man Ansichten in ASP.NET Core MVC | IronPDF in PDFs konvertiert

Konvertieren von Ansichten in PDFs in C#35; ASP.NET Core MVC

This article was translated from English: Does it need improvement?
Translated
View the article in English

Konvertieren Sie ASP.NET Core MVC-Ansichten in PDFs mit der Methode RenderRazorViewToPdf von IronPDF, die .cshtml-Dateien mit einer einzigen Codezeile in Ihrer MVC-Anwendung in hochwertige PDF-Dokumente umwandelt.

Eine Ansicht ist eine Komponente im ASP.NET Framework, die zum Generieren von HTML-Markup in Webanwendungen verwendet wird. Es ist Teil des Model-View-Controller (MVC)-Musters, das häufig in ASP.NET MVC- und ASP.NET Core MVC-Anwendungen verwendet wird. Ansichten sind für die Darstellung von Daten für Benutzer verantwortlich, indem sie HTML-Inhalte dynamisch wiedergeben. Views verwenden in der Regel die Razor-Syntax, eine Auszeichnungssyntax zum Einbetten von serverbasiertem Code in Webseiten, was sie zu leistungsfähigen Werkzeugen für die Erstellung datengesteuerter PDF-Dokumente macht.

Schnellstart: Konvertieren von CSHTML in PDF in ASP.NET Core

Umwandlung von ASP.NET Core MVC-Ansichten in PDFs mit IronPDF. Mit einer einzigen Codezeile können Sie Ihre '.cshtml'-Dateien in PDF-Dokumente umwandeln. Integrieren Sie diese Funktionalität direkt in Ihre MVC-Anwendung, um eine nahtlose PDF-Generierung aus dynamischen HTML-Ansichten zu ermöglichen. Folgen Sie diesem Leitfaden, um Ihre Umgebung einzurichten und mit der Konvertierung zu beginnen.

Nuget IconLegen Sie jetzt mit NuGet los, um PDFs zu erstellen:

  1. Installieren Sie IronPDF mit dem NuGet-Paketmanager.

    PM > Install-Package IronPdf

  2. Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.

    // using IronPdf.Extensions.Mvc.Core
    new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf");
  3. Bereitstellen zum Testen in Ihrer Live-Umgebung

    Beginnen Sie noch heute mit der Nutzung von IronPDF in Ihrem Projekt – mit einer kostenlosen Testversion.
    arrow pointer

ASP.NET Core Web App MVC (Model-View-Controller) ist ein Webanwendungs-Framework, das von Microsoft für die Erstellung von Webanwendungen mit ASP.NET Core bereitgestellt wird.

  • Modell: Repräsentiert Daten und Geschäftslogik, verwaltet Dateninteraktionen, kommuniziert mit Datenquellen.
  • Ansicht: Stellt die Benutzeroberfläche dar, zeigt Daten an und gibt Informationen an die Benutzer weiter.
  • Controller: Verarbeitet Benutzereingaben, antwortet auf Anfragen, kommuniziert mit dem Modell, orchestriert Modell-Ansicht-Interaktionen.

IronPDF ermöglicht die direkte Erstellung von PDF-Dateien aus Ansichten in ASP.NET Core MVC-Projekten. Dies macht die PDF-Erstellung in ASP.NET Core MVC einfach und unterstützt moderne Funktionen wie CSS-Styling, JavaScript-Ausführung und Benutzerdefinierte Schriftarten.

Welches Paket benötige ich für IronPDF Extensions?

Das IronPdf.Extensions.Mvc.Core-Paket ist eine Erweiterung des Hauptpakets IronPdf. Die beiden Pakete IronPdf.Extensions.Mvc.Core und IronPdf werden benötigt, um Ansichten in PDF-Dokumenten in ASP.NET Core MVC darzustellen. Das Erweiterungspaket bietet spezifische Funktionen für die Integration mit dem Dependency Injection System von ASP.NET Core und der Razor View Rendering Pipeline.

Install-Package IronPdf.Extensions.Mvc.Core

Warum brauche ich sowohl IronPDF als auch das Extensions-Paket?

Das IronPDF-Hauptpaket enthält die zentrale PDF-Rendering-Engine und grundlegende Funktionen, während das Extensions.Mvc.Core-Paket eine spezielle Integration mit dem View-Rendering-System von ASP.NET Core MVC bietet. Diese Trennung ermöglicht eine bessere Modularität und stellt sicher, dass Sie nur die spezifischen Funktionen einbeziehen, die für Ihren Projekttyp erforderlich sind. Das Erweiterungspaket enthält die IRazorViewRenderer-Schnittstelle und -Implementierung, die benötigt werden, um Razor-Ansichten vor der PDF-Erzeugung in HTML zu konvertieren.

Welche NuGet-Paketversion sollte ich verwenden?

Verwenden Sie immer die passenden Versionen von IronPDF und IronPdf.Extensions.Mvc.Core, um Kompatibilität zu gewährleisten. Informationen zu den neuesten stabilen Versionen und zur Versionskompatibilität finden Sie in der Dokumentation der NuGet-Pakete. Stellen Sie bei der Aktualisierung sicher, dass beide Pakete zusammen aktualisiert werden, um die korrekte Funktionalität zu erhalten.

Was sind häufige Probleme bei der Installation?

Zu den häufigen Installationsproblemen gehören Versionsunterschiede zwischen dem Kern- und dem Erweiterungspaket, fehlende Abhängigkeiten oder plattformspezifische Anforderungen. Wenn Sie auf Probleme stoßen, stellen Sie sicher, dass Ihr Projekt auf eine unterstützte .NET-Version abzielt, und lesen Sie die Installationsübersicht für Schritte zur Fehlerbehebung.

C# NuGet-Bibliothek für PDF

Installation mit NuGet

Install-Package IronPdf.Extensions.Mvc.Core

Wie kann ich Ansichten in PDFs rendern?

Sie benötigen ein ASP.NET Core Web App (Model-View-Controller) Projekt, um Views in PDF-Dateien zu konvertieren. Der Prozess umfasst die Erstellung einer Controller-Aktion, die die Methode RenderRazorViewToPdf von IronPDF verwendet, um Ihre Razor-Ansichten in PDF-Dokumente umzuwandeln. Dieser Ansatz nutzt die volle Leistungsfähigkeit der Razor-Syntax und ermöglicht die Erstellung komplexer, datengesteuerter PDFs mit dynamischen Inhalten.

Welchen Projekttyp sollte ich verwenden?

Verwenden Sie die ASP.NET Core Web App (Model-View-Controller) Vorlage für eine optimale Kompatibilität mit IronPDF's View-Rendering-Funktionen. Dieser Projekttyp bietet die notwendige Infrastruktur für das Rendering von Ansichten, einschließlich der Razor-View-Engine und des richtigen Routings. Bei bestehenden Projekten muss sichergestellt werden, dass sie dem MVC-Muster folgen und die erforderlichen View-Rendering-Funktionen installiert sind.

Kann ich dies mit minimalen APIs verwenden?

Auch wenn die Minimal-APIs keine integrierte Unterstützung für Ansichten bieten, können Sie dennoch die IronPDF-Funktionen zur Konvertierung von HTML in PDF nutzen. Verwenden Sie für die ansichtsbasierte PDF-Generierung den traditionellen MVC-Ansatz oder ziehen Sie Razor Pages als Alternative in Betracht.

Wie kann ich eine Modellklasse hinzufügen?

  • Navigieren Sie zum Ordner "Models".
  • Erstellen Sie eine neue C#-Klassendatei mit dem Namen "Person" Diese Klasse wird als Modell für die Darstellung individueller Daten dienen. Verwenden Sie den folgenden Codeausschnitt:
:path=/static-assets/pdf/content-code-examples/how-to/cshtml-to-pdf-mvc-core-model.cs
namespace ViewToPdfMVCCoreSample.Models
{
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
    }
}
$vbLabelText   $csharpLabel

Warum brauche ich ein Modell für die PDF-Generierung?

Modelle liefern strukturierte Daten, die zur Darstellung an Ansichten weitergegeben werden können. Diese Trennung von Belangen stellt sicher, dass die Logik der PDF-Erzeugung sauber und wartbar bleibt. Das Modell fungiert als Vertrag zwischen Ihrem Controller und Ihrer Ansicht, gewährleistet Typsicherheit und ermöglicht IntelliSense-Unterstützung in Ihren Razor-Ansichten.

Welche Datentypen funktionieren am besten mit Views?

Einfache Datentypen und Sammlungen eignen sich am besten für die PDF-Erstellung. Komplexe verschachtelte Objekte können verwendet werden, erfordern aber möglicherweise eine zusätzliche Ansichtslogik. Um eine optimale Leistung zu erzielen, sollten Sie komplexe Datenstrukturen in Ihrem Controller reduzieren, bevor Sie sie an die Ansicht weitergeben. Erwägen Sie die Verwendung von ViewModels, die speziell für die PDF-Ausgabe entwickelt wurden, wenn Ihre Domänenmodelle zu komplex sind.

Hier ist ein Beispiel für eine komplexere Modellstruktur, die sich für die PDF-Erstellung eignet:

public class InvoiceViewModel
{
    public string InvoiceNumber { get; set; }
    public DateTime InvoiceDate { get; set; }
    public decimal TotalAmount { get; set; }
    public List<InvoiceLineItem> LineItems { get; set; }
    public CustomerInfo Customer { get; set; }

    // Computed property for PDF display
    public string FormattedTotal => TotalAmount.ToString("C");
}

public class InvoiceLineItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal LineTotal => Quantity * UnitPrice;
}

public class CustomerInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
}
public class InvoiceViewModel
{
    public string InvoiceNumber { get; set; }
    public DateTime InvoiceDate { get; set; }
    public decimal TotalAmount { get; set; }
    public List<InvoiceLineItem> LineItems { get; set; }
    public CustomerInfo Customer { get; set; }

    // Computed property for PDF display
    public string FormattedTotal => TotalAmount.ToString("C");
}

public class InvoiceLineItem
{
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal LineTotal => Quantity * UnitPrice;
}

public class CustomerInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
}
$vbLabelText   $csharpLabel

Wie kann ich den Controller bearbeiten?

Navigieren Sie zum Ordner "Controllers" und öffnen Sie die Datei "HomeController". Wir werden nur Änderungen am HomeController vornehmen und die Personen-Aktion hinzufügen. Orientieren Sie sich an dem unten stehenden Code:

Der folgende Code instanziiert zunächst die Klasse ChromePdfRenderer und übergibt einen IRazorViewRenderer, den Pfad zu unserer Views/Home/Persons.cshtml und die Liste mit den erforderlichen Daten an die Methode RenderRazorViewToPdf. Benutzer können RenderingOptions verwenden, um auf eine Reihe von Funktionen zuzugreifen, wie z. B. das Hinzufügen von benutzerdefiniertem Text, das Einfügen von HTML-Kopf- und -Fußzeilen in die resultierende PDF-Datei, das Definieren benutzerdefinierter Ränder und das Anwenden von Seitenzahlen. Weitere erweiterte Rendering-Optionen finden Sie in der Dokumentation zu den Rendering-Optionen.

Hinweis:Das PDF-Dokument kann mit folgendem Code im Browser angezeigt werden: File(pdf.BinaryData, "application/pdf"). Das Herunterladen des PDF-Dokuments nach der Anzeige im Browser führt jedoch zu einem beschädigten PDF-Dokument.

using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using ViewToPdfMVCCoreSample.Models;

namespace ViewToPdfMVCCoreSample.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IRazorViewRenderer _viewRenderService;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public HomeController(ILogger<HomeController> logger, IRazorViewRenderer viewRenderService, IHttpContextAccessor httpContextAccessor)
        {
            _logger = logger;
            _viewRenderService = viewRenderService;
            _httpContextAccessor = httpContextAccessor;
        }

        public IActionResult Index()
        {
            return View();
        }

        public async Task<IActionResult> Persons()
        {
            // Example list of persons
            var persons = new List<Person>
            {
                new Person { Name = "Alice", Title = "Mrs.", Description = "Software Engineer" },
                new Person { Name = "Bob", Title = "Mr.", Description = "Software Engineer" },
                new Person { Name = "Charlie", Title = "Mr.", Description = "Software Engineer" }
            };

            // Check if the request method is POST
            if (_httpContextAccessor.HttpContext.Request.Method == HttpMethod.Post.Method)
            {
                // Create a new PDF renderer
                ChromePdfRenderer renderer = new ChromePdfRenderer();

                // Configure rendering options for better output
                renderer.RenderingOptions.MarginTop = 40;
                renderer.RenderingOptions.MarginBottom = 40;
                renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;
                renderer.RenderingOptions.Title = "Persons Report";

                // Render View to PDF document
                PdfDocument pdf = renderer.RenderRazorViewToPdf(_viewRenderService, "Views/Home/Persons.cshtml", persons);

                Response.Headers.Add("Content-Disposition", "inline");

                // Output PDF document
                return File(pdf.BinaryData, "application/pdf", "viewToPdfMVCCore.pdf");
            }

            return View(persons);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}
using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using ViewToPdfMVCCoreSample.Models;

namespace ViewToPdfMVCCoreSample.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IRazorViewRenderer _viewRenderService;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public HomeController(ILogger<HomeController> logger, IRazorViewRenderer viewRenderService, IHttpContextAccessor httpContextAccessor)
        {
            _logger = logger;
            _viewRenderService = viewRenderService;
            _httpContextAccessor = httpContextAccessor;
        }

        public IActionResult Index()
        {
            return View();
        }

        public async Task<IActionResult> Persons()
        {
            // Example list of persons
            var persons = new List<Person>
            {
                new Person { Name = "Alice", Title = "Mrs.", Description = "Software Engineer" },
                new Person { Name = "Bob", Title = "Mr.", Description = "Software Engineer" },
                new Person { Name = "Charlie", Title = "Mr.", Description = "Software Engineer" }
            };

            // Check if the request method is POST
            if (_httpContextAccessor.HttpContext.Request.Method == HttpMethod.Post.Method)
            {
                // Create a new PDF renderer
                ChromePdfRenderer renderer = new ChromePdfRenderer();

                // Configure rendering options for better output
                renderer.RenderingOptions.MarginTop = 40;
                renderer.RenderingOptions.MarginBottom = 40;
                renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;
                renderer.RenderingOptions.Title = "Persons Report";

                // Render View to PDF document
                PdfDocument pdf = renderer.RenderRazorViewToPdf(_viewRenderService, "Views/Home/Persons.cshtml", persons);

                Response.Headers.Add("Content-Disposition", "inline");

                // Output PDF document
                return File(pdf.BinaryData, "application/pdf", "viewToPdfMVCCore.pdf");
            }

            return View(persons);
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}
$vbLabelText   $csharpLabel

Nach der Verwendung der Methode RenderRazorViewToPdf erhalten Sie ein PdfDocument-Objekt, das für weitere Erweiterungen und Änderungen offen ist. Sie können das PDF in die Formate PDF/A oder PDF/UA konvertieren, dem generierten PDF Ihre digitale Signatur hinzufügen oder PDF-Dokumente nach Bedarf zusammenführen und aufteilen. Zusätzlich ermöglicht die Bibliothek das Drehen von Seiten, das Einfügen von Anmerkungen oder Lesezeichen und das Aufbringen einzigartiger Wasserzeichen auf Ihre PDF-Dateien.

Was ist der IRazorViewRenderer-Dienst?

Der IRazorViewRenderer ist eine Serviceschnittstelle, die vom IronPdf.Extensions.Mvc.Core-Paket bereitgestellt wird und die Konvertierung von Razor-Ansichten in HTML übernimmt. Es wird in die View Engine von ASP.NET Core integriert, um .cshtml-Dateien mit den zugehörigen Modellen zu verarbeiten, die gesamte Razor-Syntax auszuführen und das endgültige HTML zu erzeugen, das IronPDF in PDF konvertiert.

Warum vor dem Rendering auf die POST-Methode prüfen?

Die Prüfung auf POST stellt sicher, dass die PDF-Generierung nur dann erfolgt, wenn sie explizit über ein Formular angefordert wird. Dies verhindert eine versehentliche PDF-Erzeugung beim Laden der Seite und ermöglicht es, mit derselben Aktion sowohl die HTML-Ansicht (bei GET) als auch den PDF-Download (bei POST) zu bedienen. Dieses Muster folgt den RESTful-Prinzipien und bietet eine bessere Benutzerfreundlichkeit.

Wie kann ich die PDF-Ausgabe anpassen?

IronPDF bietet umfangreiche Anpassungsmöglichkeiten über die RenderingOptions-Eigenschaft. Hier ist ein Beispiel mit erweiterten Einstellungen:

// Advanced rendering configuration example
var renderer = new ChromePdfRenderer();

// Page setup
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

// Headers and footers with merge fields
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    Height = 25,
    HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Page {page} of {total-pages}</div>"
};

// JavaScript execution delay for dynamic content
renderer.RenderingOptions.WaitFor = new WaitFor()
{
    RenderDelay = 500, // Wait 500ms for JS execution
    NetworkIdle = NetworkIdleTypes.NetworkIdle0 // Wait for network requests
};

// Apply watermark
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
    DrawDividerLine = true,
    CenterText = "CONFIDENTIAL",
    Font = new FontTypes() { FontSize = 16 }
};
// Advanced rendering configuration example
var renderer = new ChromePdfRenderer();

// Page setup
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;

// Headers and footers with merge fields
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    Height = 25,
    HtmlFragment = "<div style='text-align: center; font-size: 12px;'>Page {page} of {total-pages}</div>"
};

// JavaScript execution delay for dynamic content
renderer.RenderingOptions.WaitFor = new WaitFor()
{
    RenderDelay = 500, // Wait 500ms for JS execution
    NetworkIdle = NetworkIdleTypes.NetworkIdle0 // Wait for network requests
};

// Apply watermark
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
    DrawDividerLine = true,
    CenterText = "CONFIDENTIAL",
    Font = new FontTypes() { FontSize = 16 }
};
$vbLabelText   $csharpLabel

Was sind häufige Controller-Fehler?

Zu den häufigen Fehlern gehören Null-Referenz-Ausnahmen, wenn Dienste nicht ordnungsgemäß injiziert werden, Pfadprobleme bei der Angabe von Ansichtspositionen und Modellbindungsprobleme. Stellen Sie sicher, dass alle erforderlichen Dienste in Program.cs registriert sind und verwenden Sie relative Pfade vom Projektstamm, wenn Sie die Speicherorte der Ansichten angeben. Aktivieren Sie zur Fehlerbehebung detaillierte Fehlermeldungen im Entwicklungsmodus.

Wie füge ich eine Ansicht hinzu?

  • Klicken Sie mit der rechten Maustaste auf die neu hinzugefügte Person-Aktion und wählen Sie "Ansicht hinzufügen"

Visual Studio-Kontextmenü mit hervorgehobener Option 'Ansicht hinzufügen...' bei Rechtsklick auf die Methode Persons()

  • Wählen Sie "Razor View" für das neue Gerüsteelement.

Add Razor View dialog in Visual Studio showing List template and Person model class selection with layout options

  • Wählen Sie die Vorlage "Liste" und die Modellklasse Person.

Add Razor View Dialog in Visual Studio mit Listenvorlage und Auswahl der Personenklasse mit Layout-Optionen

Dadurch wird eine .cshtml-Datei mit dem Namen Personen erstellt.

  • Navigieren Sie zum Ordner "Views" -> Ordner "Home" -> Datei Persons.cshtml.

Um eine Schaltfläche hinzuzufügen, die die Personen-Aktion aufruft, verwenden Sie den unten stehenden Code:

@using (Html.BeginForm("Persons", "Home", FormMethod.Post))
{
    <input type="submit" value="Print Person" />
}
@using (Html.BeginForm("Persons", "Home", FormMethod.Post))
{
    <input type="submit" value="Print Person" />
}
HTML

Warum FormMethod.Post für die PDF-Generierung verwenden?

Die Verwendung von POST für die PDF-Erzeugung entspricht den Best Practices im Web, da die Aktion explizit angegeben wird und die unerwünschte PDF-Erzeugung durch Browseraktualisierungen oder mit Lesezeichen versehene URLs verhindert wird. GET-Anfragen sollten idempotent sein (den Serverzustand nicht verändern), während POST-Anfragen eine Aktion anzeigen, die ein Ergebnis erzeugt - in diesem Fall die Erstellung eines PDF-Dokuments.

Wie kann ich die PDF-Druckschaltfläche gestalten?

Gestalten Sie die Druckschaltfläche mit CSS-Klassen und erweitern Sie sie mit JavaScript, um die Benutzerfreundlichkeit zu verbessern. Hier ist eine erweiterte Version:

@using (Html.BeginForm("Persons", "Home", FormMethod.Post, new { @class = "pdf-form" }))
{
    <button type="submit" class="btn btn-primary pdf-download-btn">
        <i class="fas fa-file-pdf"></i> Download as PDF
    </button>
}

<style>
    .pdf-download-btn {
        background-color: #dc3545;
        color: white;
        padding: 10px 20px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        transition: background-color 0.3s ease;
    }

    .pdf-download-btn:hover {
        background-color: #c82333;
    }

    .pdf-download-btn:active {
        transform: translateY(1px);
    }
</style>

<script>
    // Optional: Show loading indicator during PDF generation
    document.querySelector('.pdf-form').addEventListener('submit', function() {
        const button = this.querySelector('button');
        button.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generating PDF...';
        button.disabled = true;
    });
</script>
@using (Html.BeginForm("Persons", "Home", FormMethod.Post, new { @class = "pdf-form" }))
{
    <button type="submit" class="btn btn-primary pdf-download-btn">
        <i class="fas fa-file-pdf"></i> Download as PDF
    </button>
}

<style>
    .pdf-download-btn {
        background-color: #dc3545;
        color: white;
        padding: 10px 20px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        transition: background-color 0.3s ease;
    }

    .pdf-download-btn:hover {
        background-color: #c82333;
    }

    .pdf-download-btn:active {
        transform: translateY(1px);
    }
</style>

<script>
    // Optional: Show loading indicator during PDF generation
    document.querySelector('.pdf-form').addEventListener('submit', function() {
        const button = this.querySelector('button');
        button.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generating PDF...';
        button.disabled = true;
    });
</script>
HTML

Welche Ansichtsvorlagen eignen sich am besten für PDFs?

Die Vorlagen Liste und Details eignen sich besonders gut für die PDF-Erstellung, da sie strukturierte Layouts bieten. Benutzerdefinierte Vorlagen, die speziell für die PDF-Ausgabe entwickelt wurden, liefern oft die besten Ergebnisse. Ziehen Sie in Erwägung, spezielle PDF-Ansichten zu erstellen, die für das Drucklayout und nicht für die Bildschirmdarstellung optimiert sind, indem Sie Navigationselemente entfernen und sich auf die Darstellung des Inhalts konzentrieren.

Wie füge ich einen Abschnitt zur oberen Navigationsleiste hinzu?

  • Navigieren Sie im gleichen Ordner "Views" zum Ordner "Shared" -> _Layout.cshtml. Platzieren Sie das Navigationselement Person nach Home.

Stellen Sie sicher, dass der Wert für das Attribut asp-action genau mit unserem Dateinamen übereinstimmt, der in diesem Fall Persons lautet.

<header>
    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container-fluid">
            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ViewToPdfMVCCoreSample</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Persons">Person</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
</header>
<header>
    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container-fluid">
            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ViewToPdfMVCCoreSample</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Persons">Person</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
</header>
HTML

Warum muss die asp-Aktion genau übereinstimmen?

Das asp-action-Attribut verwendet die Tag-Helfer von ASP.NET Core, um die richtige URL auf der Grundlage Ihrer Routing-Konfiguration zu generieren. Eine exakte Übereinstimmung stellt sicher, dass der Link zur richtigen Controller-Aktion führt. Unstimmigkeiten führen zu 404-Fehlern oder zur Weiterleitung zu unbeabsichtigten Aktionen. Das Tag-Helper-System unterscheidet Groß- und Kleinschreibung und muss dem exakten Methodennamen in Ihrem Controller entsprechen.

Wenn die Navigationslinks nicht mit den Controller-Aktionen übereinstimmen, erhalten die Benutzer 404-Fehler oder werden auf falsche Seiten weitergeleitet. Während der Entwicklung zeigt die Ausnahmeseite für Entwickler von ASP.NET Core detaillierte Routing-Fehler an. In der Produktion sehen die Benutzer generische Fehlerseiten. Vergewissern Sie sich immer, dass die Navigationslinks genau mit den Namen der Controller-Aktionen übereinstimmen, um fehlerhafte Benutzererfahrungen zu vermeiden.

Wie kann ich die Datei Program.cs bearbeiten?

Registrieren Sie die Schnittstellen IHttpContextAccessor und IRazorViewRenderer für den Dependency Injection (DI) Container. Sehen Sie sich den Code unten als Referenz an.

using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();

// Register IRazorViewRenderer here
builder.Services.AddSingleton<IRazorViewRenderer, RazorViewRenderer>();

// Optional: Configure IronPDF license if you have one
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
using IronPdf.Extensions.Mvc.Core;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();

// Register IRazorViewRenderer here
builder.Services.AddSingleton<IRazorViewRenderer, RazorViewRenderer>();

// Optional: Configure IronPDF license if you have one
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
$vbLabelText   $csharpLabel

Warum Dienste als Singleton registrieren?

Singleton-Dienste werden einmal erstellt und während der gesamten Lebensdauer der Anwendung wiederverwendet, was sie für zustandslose Dienste wie IRazorViewRenderer effizient macht. Dieses Muster reduziert den Speicher-Overhead und verbessert die Leistung, da der View-Rendering-Dienst keinen anforderungsspezifischen Status beibehält. Der IHttpContextAccessor muss ein Singleton sein, um über verschiedene Dienstlaufzeiten hinweg zugänglich zu sein.

Wozu wird ITempDataProvider verwendet?

ITempDataProvider ermöglicht die Zwischenspeicherung von Daten zwischen Anfragen, die üblicherweise für die Anzeige von Meldungen nach Weiterleitungen verwendet werden. Im Zusammenhang mit der PDF-Generierung stellt sie sicher, dass der Status der Ansicht beim Rendern von Ansichten in PDF ordnungsgemäß beibehalten wird. Der CookieTempDataProvider speichert diese temporären Daten in verschlüsselten Cookies und bietet damit einen sicheren Mechanismus für die Statusverwaltung.

Kann ich stattdessen Scoped Services verwenden?

Während man für einige Szenarien Scoped Services verwenden könnte, funktioniert IRazorViewRenderer am besten als Singleton, da es keinen anfragespezifischen Status hält. Bei der Verwendung von "scoped services" würden für jede Anfrage neue Instanzen erstellt, was den Speicherverbrauch ohne Nutzen erhöht. Wenn Sie jedoch skalierte Dienste in Ihre Ansichten einbinden müssen, achten Sie auf eine ordnungsgemäße Verwaltung der Dienstlebensdauer, um Laufzeitfehler zu vermeiden.

Das Projekt ausführen

Hier wird gezeigt, wie man das Projekt ausführt und ein PDF-Dokument erzeugt. Wenn Sie die Anwendung ausführen, navigieren Sie über das obere Navigationsmenü zur Seite Personen und klicken dann auf die Schaltfläche Person drucken, um die PDF-Datei zu erstellen und herunterzuladen.

Visual Studio showing HomeController.cs with ASP.NET Core MVC controller code and IntelliSense assistance

Wo kann ich das ASP.NET Core MVC-Projekt herunterladen?

Laden Sie den vollständigen Code für diesen Leitfaden herunter. Er wird als gezippte Datei geliefert, die Sie in Visual Studio als ASP.NET Core Web App (Model-View-Controller) Projekt öffnen können.

Laden Sie das ASP.NET Core MVC Beispielprojekt herunter

Was ist im Beispielprojekt enthalten?

Das Beispielprojekt umfasst eine vollständig konfigurierte ASP.NET Core MVC-Anwendung mit IronPDF-Integration, die die View-to-PDF-Konvertierung demonstriert. Sie enthält das Modell Person, den HomeController mit der Logik für die PDF-Erzeugung, die Ansicht Personen mit der korrekten Razor-Syntax und alle erforderlichen Dienstregistrierungen in Program.cs. Das Projekt umfasst auch Beispiel-Styling und Layout-Konfigurationen, die für die PDF-Ausgabe optimiert sind.

Welche Visual Studio-Version sollte ich verwenden?

Visual Studio 2022 (Version 17.0 oder höher) wird für die beste Erfahrung mit .NET 6+ Projekten empfohlen. Visual Studio Code mit C#-Erweiterungen eignet sich auch gut für die plattformübergreifende Entwicklung. Stellen Sie sicher, dass Sie die ASP.NET- und Webentwicklungs-Workloads installiert haben. Das Projekt zielt standardmäßig auf .NET 6.0 ab, kann aber auf neuere Versionen aktualisiert werden.

Wie behebe ich Probleme bei der Projekteinrichtung?

Häufige Probleme bei der Einrichtung sind fehlende NuGet-Pakete, falsche .NET SDK-Versionen oder Konfigurationsprobleme. Stellen Sie zunächst NuGet-Pakete mit dotnet restore oder über den Paketmanager von Visual Studio wieder her. Überprüfen Sie mit dotnet --version, ob Ihre .NET SDK-Version mit den Projektanforderungen übereinstimmt. Informationen zu Lizenzierungsfragen finden Sie in der Dokumentation zum Lizenzschlüssel. Bei Rendering-Problemen finden Sie in der Anleitung zur Fehlerbehebung Lösungen.

Bereit zu sehen, was Sie sonst noch tun können? Schauen Sie sich unsere Tutorial-Seite hier an: PDFs konvertieren

Häufig gestellte Fragen

Wie lassen sich CSHTML-Ansichten in ASP.NET Core MVC am einfachsten in PDF umwandeln?

Am einfachsten ist die Verwendung der RenderRazorViewToPdf-Methode von IronPDF, mit der Sie Ihre .cshtml-Dateien mit nur einer Zeile Code in PDF-Dokumente umwandeln können. Rufen Sie einfach auf: new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf");

Welche NuGet-Pakete benötige ich für die Konvertierung von Ansichten in PDFs in ASP.NET Core MVC?

Sie benötigen zwei Pakete: IronPdf (das Hauptpaket) und IronPdf.Extensions.Mvc.Core (das Erweiterungspaket). Das Erweiterungspaket bietet spezielle Funktionen für die Integration mit dem Dependency Injection System von ASP.NET Core und der Razor View Rendering Pipeline.

Kann ich bei der Konvertierung von CSHTML in PDF CSS-Styling und JavaScript anwenden?

Ja, IronPDF unterstützt CSS-Styling, JavaScript-Ausführung und benutzerdefinierte Schriftarten beim Rendern von Ansichten in PDF vollständig. Dadurch wird sichergestellt, dass Ihre PDFs das gleiche Aussehen und die gleiche Funktionalität wie Ihre Webansichten haben, einschließlich responsive CSS und dynamische JavaScript-Inhalte.

Was sind die wichtigsten Schritte zur Implementierung der View-to-PDF-Konvertierung in meinem ASP.NET Core MVC-Projekt?

Der Arbeitsablauf umfasst 5 Schritte: 1) Herunterladen von IronPDF und seiner MVC Core-Erweiterung, 2) Hinzufügen einer Modellklasse für Ihre Daten, 3) Bearbeiten Ihres Controllers, um die RenderRazorViewToPdf-Methode zu verwenden, 4) Erstellen oder Ändern einer Ansicht (.cshtml-Datei) für das PDF-Rendering und 5) Ausführen Ihrer Anwendung, um PDFs zu erzeugen.

Wie funktioniert das MVC-Muster bei der PDF-Generierung aus Ansichten?

In ASP.NET Core MVC enthält das Model Ihre Daten und Geschäftslogik, die View (Ihre .cshtml-Datei) stellt die Benutzeroberfläche dar und zeigt Daten an, und der Controller verarbeitet Anfragen und verwendet die RenderRazorViewToPdf-Methode von IronPDF, um die PDF-Erzeugung aus der View zu orchestrieren.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Rezensiert von
Jeff Fritz
Jeffrey T. Fritz
Principal Program Manager - .NET Community Team
Jeff ist außerdem Principal Program Manager für das .NET- und Visual Studio-Team. Er ist der ausführende Produzent der .NET Conf Virtual Conference Series und moderiert ‚Fritz and Friends‘, einen Livestream für Entwickler, der zweimal wöchentlich ausgestrahlt wird. Dort spricht er über Technik und schreibt gemeinsam mit den Zuschauern Code. Jeff schreibt Workshops, Präsentationen und plant Inhalte für die größten Microsoft-Entwicklerveranstaltungen, einschließlich Microsoft Build, Microsoft Ignite, .NET Conf und dem Microsoft MVP Summit.
Bereit anzufangen?
Nuget Downloads 17,012,929 | Version: 2025.12 gerade veröffentlicht