如何在 C## ASP.NET Core MVC 中将视图转换为 PDF
通过使用IronPDF的RenderRazorViewToPdf方法,将ASP.NET Core MVC视图转换为PDF,这个方法可以将.cshtml文件转换为高质量的PDF文档,只需在您的MVC应用程序中输入一行代码。
视图是 ASP.NET Framework中用于在 Web 应用程序中生成 HTML 标记的组件。 它是模型-视图-控制器(MVC)模式的一部分,常用于 ASP.NET MVC 和 ASP.NET Core MVC 应用程序。 视图负责通过动态呈现 HTML 内容向用户展示数据。 视图通常使用 Razor 语法,这是一种将基于服务器的代码嵌入网页的标记语法,使其成为创建数据驱动型 PDF 文档的强大工具。
快速入门:在ASP.NET Core中将 CSHTML 转换为 PDF
using IronPDF for .NET 将 ASP.NET Core MVC 视图转换为 PDF。 只需一行代码,即可将您的.cshtml文件渲染为PDF文档。 将此功能直接集成到您的 MVC 应用程序中,以便从动态 HTML 视图无缝生成 PDF。 请按照本指南设置环境并开始转换。
ASP.NET Core Web App MVC(模型-视图-控制器)是微软提供的一个 Web 应用程序框架,用于使用 ASP.NET Core 构建 Web 应用程序。
Model: 代表数据和业务逻辑,管理数据交互,与数据源通信。View: 展示用户界面,显示数据,向用户渲染信息。Controller: 处理用户输入,响应请求,与Model通信,协调模型-视图交互。
IronPDF 可在 ASP.NET Core MVC 项目中通过视图直接创建 PDF 文件。 这使得 PDF 生成在 ASP.NET Core MVC 中变得简单明了,支持包括 CSS 风格、JavaScript 执行和 自定义字体在内的现代功能。
最小工作流程(5 个步骤)
- 下载用于在 ASP.NET Core MVC 中将视图转换为 PDF 的 C# 库。
- 添加一个数据模型类
- 编辑 "HomeController.cs "文件并使用
RenderRazorViewToPdf方法 - 创建新视图并编辑".cshtml "文件以呈现 PDF
- 下载样本项目以快速开始
IronPDF 扩展需要哪些软件包?
IronPdf包的扩展。 要在ASP.NET Core MVC中将视图渲染为PDF文档,需要同时使用IronPdf包。 扩展包提供了与 ASP.NET Core 的依赖注入系统和 Razor 视图渲染管道集成的特定功能。
安装-打包 IronPdf.Extensions.Mvc.Core
为什么我需要 IronPDF 和扩展包?
主IronPDF包包含核心PDF渲染引擎和基本功能,而Extensions.Mvc.Core包提供了与ASP.NET Core MVC视图渲染系统的专业集成。 这种分离可以实现更好的模块化,确保只包含项目类型所需的特定功能。 扩展包包括IRazorViewRenderer接口和实现,需在生成PDF之前转换Razor视图为HTML。
我应该使用哪个 NuGet 软件包版本?
始终使用匹配版本的IronPdf.Extensions.Mvc.Core以确保兼容性。 有关最新稳定版本和版本兼容性信息,请查看 NuGet 软件包文档。 更新时,确保两个软件包一起更新,以保持适当的功能。
常见的安装问题有哪些?
常见的安装问题包括核心软件包和扩展软件包之间的版本不匹配、依赖关系缺失或特定平台要求。 如果遇到问题,请确保您的项目使用的是受支持的 .NET 版本,并查看安装概述以了解故障排除步骤。
通过 NuGet 安装
安装-打包 IronPdf.Extensions.Mvc.Core
如何将视图渲染为 PDF?
您需要一个 ASP.NET Core Web App(模型-视图-控制器)项目来将视图转换为 PDF 文件。 该过程涉及创建一个控制器操作,使用IronPDF的RenderRazorViewToPdf方法将您的Razor视图转换为PDF文档。 这种方法充分利用了 Razor 语法的全部功能,使您能够创建具有动态内容的复杂、数据驱动型 PDF。
我应该使用哪种项目类型?
using ASP.NET Core Web App(模型-视图-控制器)模板,以获得与 IronPDF 视图渲染功能的最佳兼容性。 该项目类型为视图渲染提供了必要的基础设施,包括 Razor 视图引擎和适当的路由。 对于现有项目,应确保它们遵循 MVC 模式并安装了所需的视图渲染功能。
我可以使用最小化 API 吗?
虽然 Minimal API 没有内置视图支持,但您仍然可以使用 IronPDF 的 HTML 到 PDF 转换功能。 对于基于视图的 PDF 生成,请使用传统的 MVC 方法或考虑将 Razor Pages 作为替代方法。
如何添加模型类?
- 导航到"Models"文件夹。
- 创建一个新的 C# 类文件,命名为 "Person"。该类将作为表示个人数据的模型。 使用以下代码片段:
: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 的模型?
模型提供结构化数据,可传递给视图进行渲染。 这种关注点的分离确保了 PDF 生成逻辑的简洁性和可维护性。 模型是控制器与视图之间的契约,可确保类型安全并在 Razor 视图中启用 IntelliSense 支持。
哪些数据类型最适合使用视图?
简单的数据类型和集合最适合生成 PDF。 可以使用复杂的嵌套对象,但可能需要额外的视图逻辑。 为获得最佳性能,请在控制器中将复杂的数据结构扁平化,然后再将其传递给视图。 当您的领域模型过于复杂时,请考虑使用专为 PDF 输出设计的 ViewModels。
下面是一个适合生成 PDF 的复杂模型结构示例:
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
如何编辑控制器?
导航到"Controllers"文件夹并打开Persons操作。 请参考以下代码以获得指导:
以下代码首先实例化RenderRazorViewToPdf方法。 用户可以使用RenderingOptions访问一系列功能,例如添加自定义文本、在生成的PDF中包含HTML页眉和页脚、定义自定义边距并应用页码。 有关更多高级渲染选项,请参阅渲染选项文档。
File(pdf.BinaryData, "application/pdf")。 然而,在浏览器中查看后下载 PDF 会导致 PDF 文档损坏。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
使用PdfDocument对象。 您可以将 PDF 转换为 PDF/A 或 PDF/UA 格式,在生成的 PDF 上添加数字签名,或根据需要合并和拆分 PDF 文档。 此外,该库允许您旋转页面,插入注释或书签,并在您的 PDF 文件上加盖独特的水印。
什么是IRazorViewRenderer服务?
IronPdf.Extensions.Mvc.Core包提供的服务接口,负责将Razor视图转换为HTML。 它与ASP.NET Core的视图引擎集成,处理.cshtml文件及其关联的模型,执行所有Razor语法,并生成IronPDF转换为PDF的最终HTML。
为什么要在渲染前检查 POST 方法?
检查 POST 可确保只有在通过表单提交明确请求时才生成 PDF。 这样可以防止在页面加载时意外生成 PDF,并允许同一操作同时提供 HTML 视图(GET)和 PDF 下载(POST)。 此模式遵循RESTful原则,并提供更好的用户体验。
如何自定义 PDF 输出?
IronPDF通过RenderingOptions属性提供广泛的自定义选项。 下面是一个具有更高级设置的示例:
:path=/static-assets/pdf/content-code-examples/how-to/cshtml-to-pdf-mvc-core-6.cs
// 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.RenderDelay(500); // Wait 500ms for JS execution
renderer.RenderingOptions.WaitFor.NetworkIdle0(); // Wait for network requests
// Apply watermark
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
DrawDividerLine = true,
CenterText = "CONFIDENTIAL",
Font = IronSoftware.Drawing.FontTypes.Arial,
FontSize = 16
};
Imports IronPdf
Imports IronSoftware.Drawing
' Advanced rendering configuration example
Dim 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() 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.RenderDelay(500) ' Wait 500ms for JS execution
renderer.RenderingOptions.WaitFor.NetworkIdle0() ' Wait for network requests
' Apply watermark
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.DrawDividerLine = True,
.CenterText = "CONFIDENTIAL",
.Font = FontTypes.Arial,
.FontSize = 16
}
哪些是常见的控制器错误?
常见错误包括服务未正确注入时的空引用异常、指定视图位置时的路径问题以及模型绑定问题。 确保在Program.cs中注册所有必需的服务,并在指定视图位置时使用项目根目录的相对路径。 为排除故障,请在开发模式下启用详细的错误信息。
如何添加视图?
- 右键单击新添加的
Person操作,并选择"添加视图"。

- 为新的脚手架项选择"Razor View"。

- 选择"列表"模板和
Person模型类。

这会创建一个名为.cshtml文件。
- 导航到"视图"文件夹 -> "主页"文件夹 ->
Persons.cshtml文件。
IronPdf.Extensions.Mvc.Core
要添加一个调用Persons操作的按钮,请使用以下代码:
@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" />
}
为什么使用FormMethod.Post进行PDF生成?
使用FormMethod.Post进行PDF生成遵循了Web最佳实践,使操作显式化,并防止因浏览器刷新或书签URL而产生不需要的PDF生成。 POST请求表示一个产生结果的动作——在这种情况下,生成PDF文档。
如何设置 PDF 打印按钮的样式?
使用CSS类样式化打印按钮,并用JavaScript增强用户体验。 以下是增强版:
@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?
Details模板特别适合PDF生成,因为它们提供了结构化布局。 专为 PDF 输出设计的定制模板通常能产生最佳效果。 考虑创建专门的 PDF 视图,优化印刷排版而非屏幕显示,去除导航元素,专注于内容展示。
如何在顶部导航栏中添加一个部分?
- 在同一"视图"文件夹中,导航到"共享"文件夹->
_Layout.cshtml。 将Home之后。
确保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>
为什么 asp-action 需要完全匹配?
asp-action属性使用ASP.NET Core的标记助手根据您的路由配置生成正确的URL。 精确匹配可确保链接指向正确的控制器操作。 不匹配会导致 404 错误或路由到非预期的操作。 标签辅助系统区分大小写,必须与控制器中的方法名称完全匹配。
如果导航链接不匹配会怎样?
当导航链接与控制器操作不匹配时,用户会遇到 404 错误或被引导到不正确的页面。 在开发过程中,ASP.NET Core 的开发人员异常页面会显示详细的路由错误。 在生产过程中,用户会看到通用的错误页面。 务必确保导航链接与控制器操作名称完全匹配,以防止破坏用户体验。
如何编辑 Program.cs 文件?
将IRazorViewRenderer接口注册到依赖注入(DI)容器中。 请查看下面的代码,以供参考。
:path=/static-assets/pdf/content-code-examples/how-to/cshtml-to-pdf-mvc-core-10.cs
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()
为什么要将服务注册为单例?
Singleton(单例)服务在应用生命周期内创建一次并重复使用,使之对无状态服务如IRazorViewRenderer效率高。 这种模式可以减少内存开销并提高性能,因为视图呈现服务不需要维护请求的特定状态。 IHttpContextAccessor必须是单例的,才能在不同的服务生命周期中访问。
ITempDataProvider 有何用途?
ITempDataProvider可在请求之间临时存储数据,通常用于在重定向后显示信息。 在生成 PDF 时,要确保在将视图渲染为 PDF 时正确保持视图状态。 CookieTempDataProvider将这些临时数据存储在加密的cookie中,提供了一种安全状态管理机制。
我可以使用范围服务来代替吗?
尽管在某些场景中可以使用范围服务,但IRazorViewRenderer最好用作单例,因为它不持有特定请求的状态。 使用范围服务会为每个请求创建新的实例,增加内存使用量,却没有任何好处。 不过,如果您需要在视图中注入作用域服务,请确保正确的服务生命周期管理,以避免运行时出错。
运行项目
这展示了如何运行项目并生成 PDF 文档。 当您运行应用程序时,使用顶部导航菜单导航到Print Person按钮以生成和下载PDF。
在哪里可以下载 ASP.NET Core MVC 项目?
下载本指南的完整代码。它以压缩文件的形式提供,您可以在 Visual Studio 中将其作为 ASP.NET Core Web App(模型-视图-控制器)项目打开。
示例项目包括哪些内容?
示例项目包括一个完整配置的 ASP.NET Core MVC 应用程序,其中集成了 IronPDF,演示了视图到 PDF 的转换。 它包含Program.cs中。 该项目还包括针对 PDF 输出进行优化的样式和布局配置示例。
我应该使用哪个 Visual Studio 版本?
建议使用 Visual Studio 2022(17.0 或更高版本),以获得 .NET 6+ 项目的最佳体验。 带有 C# 扩展的 Visual Studio Code 也能很好地进行跨平台开发。 确保您已安装 ASP.NET 和网络开发工作负载。 该项目默认以 .NET 6.0 为目标,但也可以更新到更新的版本。
如何排除项目设置问题?
常见的设置问题包括 NuGet 软件包丢失、.NET SDK 版本不正确或配置问题。 首先,通过dotnet restore或Visual Studio的包管理器恢复NuGet包。 使用dotnet --version验证您的.NET SDK版本是否符合项目要求。 有关许可问题,请参见许可密钥文档。 如果出现渲染问题,请查看故障排除指南了解解决方案。
准备好看看您还能做些什么吗? 查看我们的教程页面:转换PDF文档
常见问题解答
在 ASP.NET Core MVC 中将 CSHTML 视图转换为 PDF 的最简单方法是什么?
最简单的方法是使用 IronPDF 的 RenderRazorViewToPdf 方法,只需一行代码即可将您的 .cshtml 文件转换为 PDF 文档。只需调用:new IronPdf.ChromePdfRenderer().RenderRazorViewToPdf(HttpContext, "Views/Home/Report.cshtml", model).SaveAs("report.pdf");
在 ASP.NET Core MVC 中将视图转换为 PDF 需要哪些 NuGet 包?
您需要两个软件包:IronPDF(主软件包)和 IronPdf.Extensions.Mvc.Core(扩展软件包)。扩展包提供了与 ASP.NET Core 的依赖注入系统和 Razor 视图渲染管道集成的特定功能。
将 CSHTML 转换为 PDF 时,能否应用 CSS 样式和 JavaScript?
是的,IronPDF 在将视图渲染为 PDF 时完全支持 CSS 样式、JavaScript 执行和自定义字体。这可确保您的 PDF 保持与网页视图相同的外观和功能,包括响应式 CSS 和动态 JavaScript 内容。
在我的 ASP.NET Core MVC 项目中实现视图到 PDF 转换的主要步骤是什么?
工作流程包括 5 个步骤:1) 下载 IronPDF 及其 MVC Core 扩展,2) 为数据添加一个模型类,3) 编辑控制器以使用 RenderRazorViewToPdf 方法,4) 创建或修改用于 PDF 渲染的视图(.cshtml 文件),5) 运行应用程序以生成 PDF。
MVC 模式如何与从视图生成 PDF 配合使用?
在 ASP.NET Core MVC 中,模型包含数据和业务逻辑,视图(您的 .cshtml 文件)呈现用户界面并显示数据,控制器处理请求并使用 IronPDF 的 RenderRazorViewToPdf 方法协调视图生成 PDF。

