C# ASP.NET Core MVC'de Görünümleri PDF'ye Dönüştürme
ASP.NET Core MVC Görünümlerini, MVC uygulamanızda tek bir satır kodla .cshtml dosyalarını yüksek kaliteli PDF belgelerine dönüştüren IronPDF'in RenderRazorViewToPdf yöntemi kullanarak PDF'lere dönüştürün.
Bir Görünüm, web uygulamalarında HTML işaretleme oluşturmak için ASP.NET frameworkünde kullanılan bir bileşendir. ASP.NET MVC ve ASP.NET Core MVC uygulamalarında yaygın olarak kullanılan Model-View-Controller (MVC) modelinin bir parçasıdır. Görünümler, HTML içeriğini dinamik olarak render ederek, kullanıcıya veriyi sunmaktan sorumludur. Görünümler genellikle, sunucu tabanlı kodu web sayfalarına yerleştirmek için bir işaretleme sözdizimi olan Razor sözdizimini kullanır, bu da onları veri odaklı PDF belgeleri oluşturmak için güçlü araçlar haline getirir.
Başlarken: ASP.NET Core'da CSHTML'yi PDF'ye Dönüştür
IronPDF kullanarak ASP.NET Core MVC Görünümlerini PDF'ye dönüştürün. Bir satır kodla '.cshtml' dosyalarınızı PDF belgelerine render edin. Bu işlevselliği, dinamik HTML görünümlerden sorunsuz PDF oluşturma için MVC uygulamanıza doğrudan entegre edin. Çevrenizi kurmak ve dönüştürmeye başlamak için bu kılavuzu takip edin.
-
NuGet Paket Yöneticisi ile https://www.nuget.org/packages/IronPdf yükleyin
PM > Install-Package IronPdf -
Bu kod parçasını kopyalayıp çalıştırın.
// using IronPdf.Extensions.Mvc.Core new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf"); -
Canlı ortamınızda test etmek için dağıtın
Bugün projenizde IronPDF kullanmaya başlayın ücretsiz deneme ile
ASP.NET Core Web App MVC (Model-View-Controller), ASP.NET Core kullanarak web uygulamaları oluşturmak için Microsoft tarafından sağlanan bir web uygulama çerçevesidir.
- Model: Verileri ve iş mantığını temsil eder, veri etkileşimlerini yönetir, veri kaynaklarıyla iletişim kurar.
- View: Kullanıcı arayüzünü sunar, verileri görüntüler, kullanıcılara bilgi iletir.
- Controller: Kullanıcı girdisini işler, isteklere yanıt verir, Model ile iletişim kurar, Model-Görünüm etkileşimlerini organize eder.
IronPDF, ASP.NET Core MVC projeleri icinde View'lerden dogrudan PDF dosyasi oluşturmayi saglar. Bu, modern özellikleri içeren CSS stil, JavaScript yürütme ve özel fontlar dahil ASP.NET Core MVC'de PDF oluşturmayı kolaylaştırır.
Minimal Is Akisi (5 adimda)
- ASP.NET Core MVC'de Görünümleri PDF'ye dönüştürmek için C# kütüphanesini indirin
- Veri icin bir model sinifi ekleyin
- "HomeController.cs" dosyasını düzenleyin ve
RenderRazorViewToPdfyöntemini kullanın - Yeni bir Görünüm oluşturun ve PDF'i işlemek için ".cshtml" dosyasını düzenleyin
- Hızlı başlamak için örnek projeyi indirin
IronPDF Ekstra Özellikleri İçin Hangi Pakete İhtiyacım Var?
IronPdf.Extensions.Mvc.Core paketi, ana IronPdf paketinin bir uzantısıdır. PDF belgeleri oluşturmak için, ASP.NET Core MVC'de hem IronPdf.Extensions.Mvc.Core hem de IronPdf paketlerine ihtiyaç vardır. Uzantı paketi, ASP.NET Core'un bağımlılık enjeksiyon sistemi ve Razor görünüm oluşturma hattı ile entegrasyon için belirli işlevsellik sağlar.
Install-Package IronPdf.Extensions.Mvc.Core
IronPDF ve Ekstra Paketlere Neden İhtiyacım Var?
Ana IronPDF paketi, temel PDF işleme motoru ve temel işlevselliği içerirken, Extensions.Mvc.Core paketi ASP.NET Core MVC'nin görünüm işleme sistemiyle özel bir entegrasyon sağlar. Bu ayrım, daha iyi modülerlik sağlar ve proje türünüz için gerekli olan belirli işlevselliği dahil etmenizi garanti eder. Uzantı paketi, Razor görünümlerini PDF oluşturulmadan önce HTML'e dönüştürmek için gereken IRazorViewRenderer arayüzünü ve uygulamasını içerir.
Hangi NuGet Paket Sürümünü Kullanmalıyım?
Uyumluluğu sağlamak için her zaman uygun sürümlerde IronPDF ve IronPdf.Extensions.Mvc.Core kullanın. En son kararlı sürümler ve sürüm uyumluluğu bilgileri için NuGet paketleri dokümantasyonunu kontrol ediniz. Güncellerken, doğru işlevselliği korumak için her iki paketin de birlikte güncellendiğinden emin olun.
Ortak Kurulum Sorunları Nelerdir?
Yaygın kurulum sorunları, çekirdek ile uzantı paketleri arasında sürüm uyumsuzlukları, eksik bağımlılıklar veya platforma özgü gereksinimleri içerir. Sorunlarla karşılaşırsanız, projenizin desteklenen bir .NET sürümünü hedeflediğinden emin olun ve sorun giderme adımları için kurulum genel bakışını gözden geçirin.
NuGet ile yükleyin
Install-Package IronPdf.Extensions.Mvc.Core
Görünümleri PDF'lere Nasıl Dönüştürürüm?
Gorunumleri PDF dosyalarina dönüştürmek icin bir ASP.NET Core Web Uygulamasi (Model-View-Controller) projesine ihtiyaçiniz var. Süreç, Razor görünümlerinizi PDF belgelerine dönüştürmek için IronPDF'in RenderRazorViewToPdf yöntemini kullanan bir denetleyici eylemi oluşturmayı içerir. Bu yaklaşım, Razor sözdiziminin tam gücünden yararlanarak dinamik içerik ile karmaşık, veri odaklı PDF'ler oluşturmanıza olanak tanır.
Hangi Proje Türünü Kullanmalıyım?
IronPDF'nin görünüm işleme özellikleri ile en iyi uyumluluk için ASP.NET Core Web Uygulaması (Model-View-Controller) şablonunu kullanın. Bu proje türü, Razor görüntüleme motoru ve uygun yönlendirme dahil olmak üzere görüntüleme işleme için gerekli altyapıyı sağlar. Mevcut projeler için, MVC desenine uyduklarından ve gerekli görünüm oluşturma yeteneklerinin kurulu olduğundan emin olun.
Bunu Minimal API'ler ile Kullanabilir miyim?
Minimal API'lerin yerleşik view desteği olmasa da, IronPDF'in HTML'yi PDF'e dönüştürme özelliklerini kullanabilirsiniz. Görünüm tabanlı PDF oluşturma için, geleneksel MVC yaklaşımını kullanın veya alternatif olarak Razor Pages'ı düşünebilirsiniz.
Model Sınıfı Nasıl Eklerim?
- "Models" klasörüne gidin.
- Yeni bir C# sınıf dosyası "Person" adını verin. Bu sınıf, bireysel verileri temsil edecek bir model olarak işlev görecektir. Aşağıdaki kod parçasını kullanın:
: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; }
}
}
Namespace ViewToPdfMVCCoreSample.Models
Public Class Person
Public Property Id() As Integer
Public Property Name() As String
Public Property Title() As String
Public Property Description() As String
End Class
End Namespace
PDF Oluşturma Icin Neden Bir Modele İhtiyaçim Var?
Modeller, görüntüleme icin gorunumlere aktarilabilecek yapılandırilmis veriler saglar. Bu sorumlulukların ayrılması, PDF oluşturma mantığınızın temiz ve sürdürülebilir kalmasını sağlar. Model, denetleyiciniz ve görünümünüz arasında bir sözleşme olarak hareket eder, tür güvenliğini sağlar ve Razor görünümlerinizde IntelliSense desteğini etkinleştirir.
Gorunumlerle Hangi Veri Tipleri En Iyi Calisir?
Basit veri türleri ve koleksiyonlar, PDF oluşturma için en iyi şekilde çalışır. Karmaşık iç içe nesneler kullanılabilir ancak ek görünüm mantığı gerektirebilir. En iyi performans icin, karmasik veri yapilarini gorunume gecirmeden once denetleyicinizde basinlastirin. Alan modelleriniz çok karmaşıksa, PDF çıktısı için özel olarak tasarlanmış ViewModel'leri kullanmayı düşünün.
İşte PDF oluşturma için uygun olan daha karmaşık bir model yapısına bir örnek:
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; }
}
Public Class InvoiceViewModel
Public Property InvoiceNumber As String
Public Property InvoiceDate As DateTime
Public Property TotalAmount As Decimal
Public Property LineItems As List(Of InvoiceLineItem)
Public Property Customer As CustomerInfo
' Computed property for PDF display
Public ReadOnly Property FormattedTotal As String
Get
Return TotalAmount.ToString("C")
End Get
End Property
End Class
Public Class InvoiceLineItem
Public Property Description As String
Public Property Quantity As Integer
Public Property UnitPrice As Decimal
Public ReadOnly Property LineTotal As Decimal
Get
Return Quantity * UnitPrice
End Get
End Property
End Class
Public Class CustomerInfo
Public Property Name As String
Public Property Email As String
Public Property Address As String
End Class
Denetleyici Nasıl Düzenlenir?
"Controllers" klasörüne gidin ve "HomeController" dosyasını açın. Yalnızca HomeController değişiklik yapacağız ve Persons eylemini ekleyeceğiz. Aşağıdaki kodu referans alarak yol gösterici olarak kullanın:
Aşağıdaki kod, ilk olarak bir ChromePdfRenderer sınıfı oluşturur, bir IRazorViewRenderer, Views/Home/Persons.cshtml yolunu ve gerekli verileri içeren Listeyi RenderRazorViewToPdf metoduna gönderir. Kullanıcılar, özelleştirilmiş metin eklemek, çıkan PDF'de HTML başlıkları ve altlıkları dahil etmek, özel kenar boşlukları belirlemek ve sayfa numaraları uygulamak gibi bir dizi özelliğe erişmek için RenderingOptions kullanabilir. Daha gelişmiş işleme seçenekleri için işleme seçenekleri dokümantasyonuna bakınız.
File(pdf.BinaryData, "application/pdf"). Ancak, PDF'yi tarayıcıda görüntüledikten sonra indirmek, bozuk bir PDF belgesiyle sonuçlanıyor.
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 });
}
}
}
Imports IronPdf.Extensions.Mvc.Core
Imports Microsoft.AspNetCore.Mvc
Imports System.Diagnostics
Imports ViewToPdfMVCCoreSample.Models
Namespace ViewToPdfMVCCoreSample.Controllers
Public Class HomeController
Inherits Controller
Private ReadOnly _logger As ILogger(Of HomeController)
Private ReadOnly _viewRenderService As IRazorViewRenderer
Private ReadOnly _httpContextAccessor As IHttpContextAccessor
Public Sub New(logger As ILogger(Of HomeController), viewRenderService As IRazorViewRenderer, httpContextAccessor As IHttpContextAccessor)
_logger = logger
_viewRenderService = viewRenderService
_httpContextAccessor = httpContextAccessor
End Sub
Public Function Index() As IActionResult
Return View()
End Function
Public Async Function Persons() As Task(Of IActionResult)
' Example list of persons
Dim persons = New List(Of Person) From {
New Person With {.Name = "Alice", .Title = "Mrs.", .Description = "Software Engineer"},
New Person With {.Name = "Bob", .Title = "Mr.", .Description = "Software Engineer"},
New Person With {.Name = "Charlie", .Title = "Mr.", .Description = "Software Engineer"}
}
' Check if the request method is POST
If _httpContextAccessor.HttpContext.Request.Method = HttpMethod.Post.Method Then
' Create a new PDF renderer
Dim renderer As 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
Dim pdf As PdfDocument = 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")
End If
Return View(persons)
End Function
Public Function Privacy() As IActionResult
Return View()
End Function
<ResponseCache(Duration:=0, Location:=ResponseCacheLocation.None, NoStore:=True)>
Public Function Error() As IActionResult
Return View(New ErrorViewModel With {.RequestId = If(Activity.Current?.Id, HttpContext.TraceIdentifier)})
End Function
End Class
End Namespace
RenderRazorViewToPdf yöntemini kullandıktan sonra, daha fazla geliştirme ve modifikasyona açık bir PdfDocument nesnesi alırsınız. PDF'yi PDF/A veya PDF/UA formatlarına dönüştürebilir, oluşturulan PDF'ye dijital imzanızı ekleyebilir veya gerektiği gibi PDF belgelerini birleştirebilir ve bölebilirsiniz. Ayrıca, kütüphane sayfaları döndürmenize, açıklamalar veya yer imleri eklemenize ve benzersiz filigranları PDF dosyalarınıza bastırmanıza olanak tanır.
IRazorViewRenderer Servisi Nedir?
IRazorViewRenderer, Razor görünümlerini HTML'e dönüştüren IronPdf.Extensions.Mvc.Core paketi tarafından sağlanan bir hizmet arayüzüdür. ASP.NET Core'un görünüm motoruyla entegre olarak, ilişkili modelleriyle birlikte .cshtml dosyalarını işler, tüm Razor söz dizimini çalıştırır ve IronPDF'in PDF'ye dönüştürdüğü nihai HTML'yi üretir.
Neden Çizim Öncesi POST Yöntemini Kontrol Etmelisiniz?
Yalnızca bir form gönderimi aracılığıyla açıkça talep edildiğinde PDF oluşturmanın gerçekleşmesini sağlamak için POST kontrol edilir. Bu, sayfa yüklemelerinde kazara PDF oluşturulmasını engeller ve aynı işlemin hem HTML görünümüne (GET) hem de PDF indirilmeye (POST) hizmet etmesini sağlar. Bu desen RESTful ilkelerini takip eder ve daha iyi bir kullanıcı deneyimi sağlar.
PDF Çıktısını Nasıl Özelleştirebilirim?
IronPDF, RenderingOptions özelliği üzerinden geniş ölçekte özelleştirme seçenekleri sunar. İleri düzey ayarlarla ilgili bir örnek:
// 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 }
};
' Advanced rendering configuration example
Dim renderer As 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() With {
.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() With {
.RenderDelay = 500, ' Wait 500ms for JS execution
.NetworkIdle = NetworkIdleTypes.NetworkIdle0 ' Wait for network requests
}
' Apply watermark
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.DrawDividerLine = True,
.CenterText = "CONFIDENTIAL",
.Font = New FontTypes() With {.FontSize = 16}
}
Yaygın Denetleyici Hataları Nelerdir?
Ortak hatalar arasında, servisler düzgün bir şekilde enjekte edilmediğinde oluşan null referans istisnaları, görünüm konumlarını belirtirken yol sorunları ve model bağlama problemleri yer almaktadır. Gerekli tüm hizmetlerin Program.cs içinde kayıtlı olduğundan ve görünüm konumlarını belirtirken proje kökünden göreli yollar kullandığınızdan emin olun. Hata ayiklama icin geliştirme modunda ayrintili hata mesajlarini etkinlestirin.
Görünüm Nasıl Eklenir?
- Yeni eklenen
Personeylemine sağ tıklayın ve 'Add View' seçeneğini seçin.

- Yeni Sarılmış öğe için "Razor Görünümü" seçin.

- 'List' şablonunu ve
Personmodel sınıfını seçin.

Bu, Persons adlı bir .cshtml dosyası oluşturur.
- "Görünümler" klasörüne gidin -> "Ana Sayfa" klasörü ->
Persons.cshtmldosyası.
Persons eylemini başlatan bir düğme eklemek için aşağıdaki kodu kullanın:
@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" />
}
PDF Oluşturma İçin Neden FormMethod.Post Kullanılır?
PDF oluşturma için POST kullanmak, eylemi belirgin hale getirerek ve istenmeyen PDF oluşturmayı tarayıcı yenilemelerinden veya yer imlerine alınmış URL'lerden önleyerek web en iyi uygulamalarını takip eder. GET istekleri etkisiz olmalıdır (sunucu durumunu değiştirmemeli), oysa POST istekleri bir sonuç üreten bir işlemi belirtir – bu durumda bir PDF belgesinin oluşturulması.
PDF Yazdir Butonunu Nasıl Stileyebilirim?
Print düğmesini CSS sınıflarını kullanarak stillendirin ve daha iyi bir kullanıcı deneyimi için JavaScript ile geliştirin. Iste geliştirilmis bir versiyon:
@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>
PDF'ler için Hangi Görünüm Şablonları En İyi Çalışır?
List ve Details şablonları PDF oluşturma için özellikle iyi çalışır çünkü yapılandırılmış düzenler sağlarlar. Genellikle PDF çıktı için özel olarak tasarlanmış özel şablonlar en iyi sonuçları verir. PDF görünümlerini yalnızca baskı düzeni için optimize etmeyi düşünebilirsiniz. Ekran görüntüsü yerine içerik sunumuna odaklanan ve navigasyon öğelerini kaldıran özel PDF görünümleri oluşturun.
Üst Navigasyon Çubuğuna Bir Bölüm Nasıl Eklerim?
- Aynı "Görünümler" klasörüne gidin, "Paylaşılan" klasörüne ->
_Layout.cshtml.Personnavigasyon öğesiniHomesonrasına yerleştirin.
asp-action özniteliğinin değeri, dosya adımızla tam olarak eşleştiğinden emin olun, bu durumda Persons.
<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>
Neden asp-action Tam Olarak Eşleşmelidir?
asp-action özniteliği, yönlendirme konfigurasyonunuza göre doğru URL'yi oluşturmak için ASP.NET Core'un etiket yardımcılarını kullanır. Doğru bir eşleşme, bağlantının doğru controller action'a yönlenmesini sağlar. Eşleşmelerin uyumsuzluğu, 404 hatalarına veya istenmeyen eylemlere yönlendirmeye neden olur. Etiket yardımcı sistemi büyük/küçük harfe duyarlıdır ve kontrolcünüzdeki tam yöntem adıyla eşleşmelidir.
Navigasyon Bağlantıları Eşleşmezse Ne Olur?
Navigasyon bağlantıları kontrolör eylemleriyle eşleşmediğinde, kullanıcılar 404 hatalarıyla karşılaşır veya yanlış sayfalara yönlendirilirler. Geliştirme sırasında ASP.NET Core'un geliştirici istisna sayfası ayrıntılı yönlendirme hatalarını gösterir. Üretimde kullanıcılar genel hata sayfalarını görürler. Kırık kullanıcı deneyimlerini önlemek için navigasyon bağlantılarının kontrolör eylem adlarıyla tam olarak eşleştiğini daima doğrulayın.
Program.cs Dosyasını Nasıl Düzenlerim?
IHttpContextAccessor ve IRazorViewRenderer arayüzünü bağımlılık enjeksiyonu (DI) konteynerine kaydedin. Referans için aşağıdaki kodu kontrol edin.
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();
Imports IronPdf.Extensions.Mvc.Core
Imports Microsoft.AspNetCore.Mvc.ViewFeatures
Dim builder = WebApplication.CreateBuilder(args)
' Add services to the container.
builder.Services.AddControllersWithViews()
builder.Services.AddSingleton(Of IHttpContextAccessor, HttpContextAccessor)()
builder.Services.AddSingleton(Of ITempDataProvider, CookieTempDataProvider)()
' Register IRazorViewRenderer here
builder.Services.AddSingleton(Of IRazorViewRenderer, RazorViewRenderer)()
' Optional: Configure IronPDF license if you have one
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
Dim app = builder.Build()
' Configure the HTTP request pipeline.
If Not app.Environment.IsDevelopment() Then
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()
End If
app.UseHttpsRedirection()
app.UseStaticFiles()
app.UseRouting()
app.UseAuthorization()
app.MapControllerRoute(
name:="default",
pattern:="{controller=Home}/{action=Index}/{id?}")
app.Run()
Hizmetler Neden Tekil Olarak Kaydedilmeli?
Singleton hizmetler bir kez oluşturulur ve uygulamanın ömrü boyunca yeniden kullanılır, bu da onları IRazorViewRenderer gibi durumsuz hizmetler için verimli kılar. Bu desen bellek yükünü azaltır ve performansı artırır çünkü görünüm oluşturma hizmeti istek özelinde durum korumaz. IHttpContextAccessor, farklı hizmet ömürleri boyunca erişilebilir olabilmesi için singleton olmalıdır.
ITempDataProvider Ne İçin Kullanılır?
ITempDataProvider, istekler arasında geçici veri depolama sağlar, genellikle yönlendirmelerden sonra mesajlar görüntülemek için kullanılır. PDF oluşturma bağlamında, görünümlerin PDF'ye dönüştürülmesi sırasında görüntü durumunun doğru bir şekilde korunmasını sağlar. CookieTempDataProvider, bu geçici verileri şifreli çerezlerde saklar, durum yönetimi için güvenli bir mekanizma sağlar.
Yerine Kapsamlı Hizmetler Kullanabilir miyim?
Bazı senaryolar için kapsamlı hizmetler kullanabilseniz de, IRazorViewRenderer, istek-spesifik durum tutmadığından bir singleton olarak en iyi şekilde çalışır. Kapsamlı hizmetler kullanmak her istek için yeni örnekler oluşturur ve herhangi bir fayda olmadan bellek kullanımını artırır. Ancak, eğer görünümünüze kapsamlı hizmetler enjekte etmeniz gerekiyorsa, çalışma süresi hatalarından kaçınmak için doğru hizmet ömrü yönetimini sağlayın.
Projeyi Çalıştır
Bu, projeyi çalıştırmanın ve bir PDF dokümanı oluşturmanın nasıl yapıldığını gösterir. Uygulamayı çalıştırdığınızda, PDF oluşturup indirmek için üst navigasyon menüsünden Persons sayfasına gidin, ardından Print Person düğmesine tıklayın.
ASP.NET Core MVC Projesini Nereden İndirebilirim?
Bu kılavuzun tam kodunu indirin. Visual Studio'da ASP.NET Core Web App (Model-View-Controller) projesi olarak açabileceğiniz bir sıkıştırılmış dosya olarak gelir.
ASP.NET Core MVC Örnek Projesini İndirin
Örnek Projede Neler Var?
Örnek proje, IronPDF entegrasyonu ile tam olarak yapılandırılmış bir ASP.NET Core MVC uygulamasını ve görünümden PDF'ye dönüşüm örneğini içerir. Bu, Person modeli, PDF oluşturma mantığı ile HomeController, uygun Razor sözdizimi ile Persons görünümü ve Program.cs tüm gerekli hizmet kayıtlarını içerir. Proje ayrıca PDF çıktısı için optimize edilmiş örnek stil ve yerleşim yapılandırmalarını da içerir.
Hangi Visual Studio Sürümünü Kullanmalıyım?
.NET 6+ projeleriyle en iyi deneyim için Visual Studio 2022 (sürüm 17.0 veya üzeri) önerilir. Visual Studio Code, C# eklentileri ile birlikte çapraz platform geliştirme için de iyi çalışır. ASP.NET ve web geliştirme yükünün yüklü olduğundan emin olun. Proje varsayılan olarak .NET 6.0'ı hedefler, ancak daha yeni sürümlere güncellenebilir.
Proje Kurulum Sorunlarını Nasıl Çözebilirim?
Genel kurulum sorunları arasında eksik NuGet paketleri, yanlış .NET SDK sürümleri veya yapılandırma sorunları bulunur. İlk olarak, dotnet restore kullanarak veya Visual Studio'nun Paket Yöneticisi aracılığıyla NuGet paketlerini geri yükleyin. dotnet --version kullanarak .NET SDK sürümünüzün proje gereksinimlerini karşıladığını doğrulayın. Lisans sorunları için lisans anahtarı belgesine bakın. Önbellek sorunları meydana gelirse, sorun giderme klavuzunu kontrol edin.
Başka neler yapabileceğinizi görmek için hazır mısınız? Eğitim sayfamızı burada inceleyin: PDF'leri Dönüştürün
Sıkça Sorulan Sorular
ASP.NET Core MVC'de CSHTML görünümlerini PDF'ye dönüştürmenin en kolay yolu nedir?
En kolay yol, IronPDF'nin RenderRazorViewToPdf metodunu kullanmaktır. Bu yöntem, .cshtml dosyalarınızı PDF belgelerine dönüştürmek için sadece bir satır kod gerektirir. Sadece şu şekilde çağırın: new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, 'Views/Home/Report.cshtml', model).SaveAs('report.pdf');
ASP.NET Core MVC'de Görünümleri PDF'lere dönüştürmek için hangi NuGet paketlerine ihtiyaçım var?
İki pakete ihtiyaçınız var: IronPdf (ana paket) ve IronPdf.Extensions.Mvc.Core (uzantı paketi). Uzantı paketi, ASP.NET Core'un bağımlılık enjeksiyon sistemi ve Razor görünüm işleme boru hattı ile entegrasyon için özel işlevsellik sağlar.
CSHTML'yi PDF'ye dönüştürürken CSS stilizasyonu ve JavaScript uygulayabilir miyim?
Evet, IronPDF, CSS stilizasyonu, JavaScript yürütmesi ve özel fontları tamamen destekler ve Görünümleri PDF'ye işlerken, bu PDF'lerinizin web görünümlerinizle aynı görünüm ve işlevselliği sürdürmesini sağlar, duyarlı CSS ve dinamik JavaScript içeriği dahil.
ASP.NET Core MVC projemde Görünümü PDF'ye dönüştürmek için ana adımlar nelerdir?
İş akışı 5 adımdan oluşur: 1) IronPDF ve MVC Core uzantısını indirin, 2) Verileriniz için bir model sınıfı ekleyin, 3) Controller'ınızı RenderRazorViewToPdf metodunu kullanacak şekilde düzenleyin, 4) PDF işleme için bir Görünüm (.cshtml dosyası) oluşturun veya değiştirin ve 5) Uygulamanızı çalıştırarak PDF'ler oluşturun.
Görünüm'den PDF oluşturma sırasında MVC modeli nasıl çalışır?
ASP.NET Core MVC'de, Model verilerinizi ve iş mantığını içerir, Görünüm (.cshtml dosyanız) UI'yi sunar ve verileri görüntüler, ve Kontrolcü istekleri ele alır ve Görünüm'den PDF oluşturmak için IronPDF'nin RenderRazorViewToPdf metodunu kullanır.

