使用IRONPDF 如何使用IronPDF在C#中使用Fluent Validation Curtis Chau 更新日期:7月 28, 2025 Download IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article What is Fluent Validation? FluentValidation is a .NET validation library that helps in building strongly typed validation rules. It uses a fluent interface and lambda expressions, making the code more readable and maintainable. Instead of using data annotations or manual validation in your model classes, you can use Fluent Validation to build a separate class for your validation logic. Fluent Validation brings more flexibility to the validation game. With built-in validators for common scenarios, the ability to build custom validations, and a simple way to chain validation rules, Fluent Validation is a powerful tool in the .NET Core toolkit. Understanding Fluent Validation Fluent Validation is an open-source library for .NET that makes it easy to build validation rules for your model classes. Validators: Validators are classes that encapsulate the validation logic. They are typically created by inheriting from the AbstractValidator<T> base class. Rules: A rule is a validation condition that a property must meet. Rules are defined using the RuleFor method in a validator class. Validation Failures: If a rule fails, Fluent Validation creates a ValidationFailure object that contains details about the error, including the property name and error message. What is IronPDF? IronPDF - Convert HTML to PDF in C# is a powerful .NET library that allows you to generate PDF documents from HTML content. Whether you need to create invoices, reports, or any other type of document, IronPDF provides an easy-to-use solution. It seamlessly integrates with your ASP.NET Core applications, enabling you to generate high-quality PDF files with just a few lines of code. Using Fluent Validation with IronPDF Now that we understand what Fluent Validation and IronPDF are, let's see how they can be used together. This tutorial will help build an invoice generator, where the invoice content will be validated using FluentValidation in ASP.NET Core before generating the PDF using IronPDF. Setting Up the Project To begin, let's create a new Console Application in Visual Studio or your preferred development environment. Open Visual Studio and go to File > New > Project. Select "Console App (ASP.NET Core)" as the project template and provide a name for your project. Create a new Console Application Click the Next button and configure your project by naming it and selecting the repository location. Configure the new application Click on the Next button and select the .NET Framework. The latest .NET Framework (7) is recommended. .NET Framework selection Click on the Create button to create the project. Install Required Packages Once the project is created, add the necessary NuGet packages for Fluent Validation and IronPDF. Right-click on the project in the Solution Explorer and select "Manage NuGet Packages." Search for "FluentValidation" and click "Install" to add the package to your project. Install the FluentValidation package in NuGet Package Manager UI Similarly, search for "IronPDF - Powerful .NET PDF Library" and install the IronPDF package. Alternatively, you can install IronPDF using NuGet Package Manager Console with the following command: Install-Package IronPdf Install the IronPdf package in the Package Manager Console With the project set up and the required packages installed, let's move on to defining the PDF content class. Defining the PDF Content In this example, a simple invoice PDF will be created from the HTML codes in two classes: InvoiceContent and InvoiceItem. using System.Collections.Generic; using System.Linq; public abstract class PdfContent { // Abstract method to generate the HTML string public abstract string RenderHtml(); } public class InvoiceContent : PdfContent { public string CustomerName { get; set; } public string Address { get; set; } public List<InvoiceItem> InvoiceItems { get; set; } // Constructs the HTML representation of the invoice public override string RenderHtml() { string invoiceItemsHtml = string.Join("", InvoiceItems.Select(item => $"<li>{item.Description}: {item.Price}</li>")); return $"<h1>Invoice for {CustomerName}</h1><p>{Address}</p><ul>{invoiceItemsHtml}</ul>"; } } public class InvoiceItem { public string Description { get; set; } public decimal Price { get; set; } } using System.Collections.Generic; using System.Linq; public abstract class PdfContent { // Abstract method to generate the HTML string public abstract string RenderHtml(); } public class InvoiceContent : PdfContent { public string CustomerName { get; set; } public string Address { get; set; } public List<InvoiceItem> InvoiceItems { get; set; } // Constructs the HTML representation of the invoice public override string RenderHtml() { string invoiceItemsHtml = string.Join("", InvoiceItems.Select(item => $"<li>{item.Description}: {item.Price}</li>")); return $"<h1>Invoice for {CustomerName}</h1><p>{Address}</p><ul>{invoiceItemsHtml}</ul>"; } } public class InvoiceItem { public string Description { get; set; } public decimal Price { get; set; } } Imports System.Collections.Generic Imports System.Linq Public MustInherit Class PdfContent ' Abstract method to generate the HTML string Public MustOverride Function RenderHtml() As String End Class Public Class InvoiceContent Inherits PdfContent Public Property CustomerName() As String Public Property Address() As String Public Property InvoiceItems() As List(Of InvoiceItem) ' Constructs the HTML representation of the invoice Public Overrides Function RenderHtml() As String Dim invoiceItemsHtml As String = String.Join("", InvoiceItems.Select(Function(item) $"<li>{item.Description}: {item.Price}</li>")) Return $"<h1>Invoice for {CustomerName}</h1><p>{Address}</p><ul>{invoiceItemsHtml}</ul>" End Function End Class Public Class InvoiceItem Public Property Description() As String Public Property Price() As Decimal End Class $vbLabelText $csharpLabel In the code above, an abstract PdfContent class is defined with an abstract method called RenderHtml. The InvoiceContent class extends PdfContent and represents the content of the invoice PDF. It has properties for the customer's name, address, and a list of invoice items. The InvoiceItem class contains two properties: 'Description' and 'Price'. The RenderHtml method generates the HTML markup for the invoice based on the content. Now that the PDF content is defined, let's move on to creating validation rules using Fluent Validation. Creating Validation Rules For building validation rules for the InvoiceContent class, create a validator class called InvoiceContentValidator. This class will inherit from AbstractValidator<InvoiceContent>, which is provided by FluentValidation. using FluentValidation; public class InvoiceContentValidator : AbstractValidator<InvoiceContent> { public InvoiceContentValidator() { RuleFor(content => content.CustomerName).NotEmpty().WithMessage("Customer name is required."); RuleFor(content => content.Address).NotEmpty().WithMessage("Address is required."); RuleFor(content => content.InvoiceItems).NotEmpty().WithMessage("At least one invoice item is required."); RuleForEach(content => content.InvoiceItems).SetValidator(new InvoiceItemValidator()); } } public class InvoiceItemValidator : AbstractValidator<InvoiceItem> { public InvoiceItemValidator() { RuleFor(item => item.Description).NotEmpty().WithMessage("Description is required."); RuleFor(item => item.Price).GreaterThanOrEqualTo(0).WithMessage("Price must be greater than or equal to 0."); } } using FluentValidation; public class InvoiceContentValidator : AbstractValidator<InvoiceContent> { public InvoiceContentValidator() { RuleFor(content => content.CustomerName).NotEmpty().WithMessage("Customer name is required."); RuleFor(content => content.Address).NotEmpty().WithMessage("Address is required."); RuleFor(content => content.InvoiceItems).NotEmpty().WithMessage("At least one invoice item is required."); RuleForEach(content => content.InvoiceItems).SetValidator(new InvoiceItemValidator()); } } public class InvoiceItemValidator : AbstractValidator<InvoiceItem> { public InvoiceItemValidator() { RuleFor(item => item.Description).NotEmpty().WithMessage("Description is required."); RuleFor(item => item.Price).GreaterThanOrEqualTo(0).WithMessage("Price must be greater than or equal to 0."); } } Imports FluentValidation Public Class InvoiceContentValidator Inherits AbstractValidator(Of InvoiceContent) Public Sub New() RuleFor(Function(content) content.CustomerName).NotEmpty().WithMessage("Customer name is required.") RuleFor(Function(content) content.Address).NotEmpty().WithMessage("Address is required.") RuleFor(Function(content) content.InvoiceItems).NotEmpty().WithMessage("At least one invoice item is required.") RuleForEach(Function(content) content.InvoiceItems).SetValidator(New InvoiceItemValidator()) End Sub End Class Public Class InvoiceItemValidator Inherits AbstractValidator(Of InvoiceItem) Public Sub New() RuleFor(Function(item) item.Description).NotEmpty().WithMessage("Description is required.") RuleFor(Function(item) item.Price).GreaterThanOrEqualTo(0).WithMessage("Price must be greater than or equal to 0.") End Sub End Class $vbLabelText $csharpLabel In the source code, the InvoiceContentValidator class is defined, which inherits from AbstractValidator<InvoiceContent>. Inside the constructor of the validator class, the RuleFor method defines validation rules for each property of the InvoiceContent class. For example, RuleFor(content => content.CustomerName) specifies that the customer name should not be empty. Similarly, validation rules are defined for the address and invoice items properties. The RuleForEach method iterates over each item in the InvoiceItems list and applies the InvoiceItemValidator. The InvoiceItemValidator class contains validation rules for the InvoiceItem class. With these validation rules in place, let's move on to generating the PDF using IronPDF. Generating PDF using IronPDF IronPDF - Generate and Edit PDF Documents is a popular .NET library for creating and manipulating PDF documents. IronPDF will be used to generate the PDF based on the validated invoice content. using IronPdf; using FluentValidation; public class PdfService { // Generates a PDF document for the provided content public PdfDocument GeneratePdf<T>(T content) where T : PdfContent { // Validate the content using the appropriate validator var validator = GetValidatorForContent(content); var validationResult = validator.Validate(content); // Check if validation is successful if (!validationResult.IsValid) { throw new FluentValidation.ValidationException(validationResult.Errors); } // Generate the PDF using IronPDF var renderer = new ChromePdfRenderer(); return renderer.RenderHtmlAsPdf(content.RenderHtml()); } // Retrieves the appropriate validator for the content private IValidator<T> GetValidatorForContent<T>(T content) where T : PdfContent { if (content is InvoiceContent) { return (IValidator<T>)new InvoiceContentValidator(); } else { throw new NotSupportedException("Unsupported content type."); } } } using IronPdf; using FluentValidation; public class PdfService { // Generates a PDF document for the provided content public PdfDocument GeneratePdf<T>(T content) where T : PdfContent { // Validate the content using the appropriate validator var validator = GetValidatorForContent(content); var validationResult = validator.Validate(content); // Check if validation is successful if (!validationResult.IsValid) { throw new FluentValidation.ValidationException(validationResult.Errors); } // Generate the PDF using IronPDF var renderer = new ChromePdfRenderer(); return renderer.RenderHtmlAsPdf(content.RenderHtml()); } // Retrieves the appropriate validator for the content private IValidator<T> GetValidatorForContent<T>(T content) where T : PdfContent { if (content is InvoiceContent) { return (IValidator<T>)new InvoiceContentValidator(); } else { throw new NotSupportedException("Unsupported content type."); } } } Imports IronPdf Imports FluentValidation Public Class PdfService ' Generates a PDF document for the provided content Public Function GeneratePdf(Of T As PdfContent)(ByVal content As T) As PdfDocument ' Validate the content using the appropriate validator Dim validator = GetValidatorForContent(content) Dim validationResult = validator.Validate(content) ' Check if validation is successful If Not validationResult.IsValid Then Throw New FluentValidation.ValidationException(validationResult.Errors) End If ' Generate the PDF using IronPDF Dim renderer = New ChromePdfRenderer() Return renderer.RenderHtmlAsPdf(content.RenderHtml()) End Function ' Retrieves the appropriate validator for the content Private Function GetValidatorForContent(Of T As PdfContent)(ByVal content As T) As IValidator(Of T) If TypeOf content Is InvoiceContent Then Return DirectCast(New InvoiceContentValidator(), IValidator(Of T)) Else Throw New NotSupportedException("Unsupported content type.") End If End Function End Class $vbLabelText $csharpLabel The PdfService class provides a GeneratePdf method. This method takes a PdfContent object as input and generates the PDF document based on the validated content. First, it retrieves the appropriate validator for the content by calling the GetValidatorForContent method, which checks the type of content and returns the corresponding validator. In our case, we support InvoiceContent and use the InvoiceContentValidator. Next, the content is validated using the validator by calling its Validate method. The validation result is stored in a ValidationResult object. If the validation fails (!validationResult.IsValid), a FluentValidation.ValidationException is thrown with the validation errors. Otherwise, the PDF is generated using IronPDF. An instance of ChromePdfRenderer is created to render the HTML content as a PDF. The RenderHtmlAsPdf method is called on the renderer object, passing in the HTML generated by the content.RenderHtml method, generating the PDF document. Now that we have defined the PDF generation logic, let's handle any validation errors that may occur. Handling Validation Errors When a validation error occurs, we want to display an error message and handle it gracefully. Let's modify the Main method of the Program class to handle any exceptions and display meaningful messages to the user. using System; using System.Collections.Generic; public class Program { static void Main(string[] args) { var pdfService = new PdfService(); // Test 1: Empty Customer Name try { var invoiceContent = new InvoiceContent { CustomerName = "", Address = "123 Main St, Anytown, USA", InvoiceItems = new List<InvoiceItem> { new InvoiceItem { Description = "Item 1", Price = 19.99M }, new InvoiceItem { Description = "Item 2", Price = 29.99M } } }; var pdfDocument = pdfService.GeneratePdf(invoiceContent); pdfDocument.SaveAs("C:\\TestInvoice.pdf"); Console.WriteLine("PDF generated successfully!"); } catch (Exception ex) { Console.WriteLine("Error generating PDF: " + ex.Message); } // Test 2: Empty InvoiceItems try { var invoiceContent = new InvoiceContent { CustomerName = "John Doe", Address = "123 Main St, Anytown, USA", InvoiceItems = new List<InvoiceItem>() // Empty list }; var pdfDocument = pdfService.GeneratePdf(invoiceContent); pdfDocument.SaveAs("C:\\TestInvoice.pdf"); Console.WriteLine("PDF generated successfully!"); } catch (Exception ex) { Console.WriteLine("Error generating PDF: " + ex.Message); } // Successful generation try { var invoiceContent = new InvoiceContent { CustomerName = "John Doe", Address = "123 Main St, Anytown, USA", InvoiceItems = new List<InvoiceItem> { new InvoiceItem { Description = "Item 1", Price = 19.99M }, new InvoiceItem { Description = "Item 2", Price = 29.99M } } }; var pdfDocument = pdfService.GeneratePdf(invoiceContent); pdfDocument.SaveAs("C:\\TestInvoice.pdf"); Console.WriteLine("PDF generated successfully!"); } catch (Exception ex) { Console.WriteLine("Error generating PDF: " + ex.Message); } } } using System; using System.Collections.Generic; public class Program { static void Main(string[] args) { var pdfService = new PdfService(); // Test 1: Empty Customer Name try { var invoiceContent = new InvoiceContent { CustomerName = "", Address = "123 Main St, Anytown, USA", InvoiceItems = new List<InvoiceItem> { new InvoiceItem { Description = "Item 1", Price = 19.99M }, new InvoiceItem { Description = "Item 2", Price = 29.99M } } }; var pdfDocument = pdfService.GeneratePdf(invoiceContent); pdfDocument.SaveAs("C:\\TestInvoice.pdf"); Console.WriteLine("PDF generated successfully!"); } catch (Exception ex) { Console.WriteLine("Error generating PDF: " + ex.Message); } // Test 2: Empty InvoiceItems try { var invoiceContent = new InvoiceContent { CustomerName = "John Doe", Address = "123 Main St, Anytown, USA", InvoiceItems = new List<InvoiceItem>() // Empty list }; var pdfDocument = pdfService.GeneratePdf(invoiceContent); pdfDocument.SaveAs("C:\\TestInvoice.pdf"); Console.WriteLine("PDF generated successfully!"); } catch (Exception ex) { Console.WriteLine("Error generating PDF: " + ex.Message); } // Successful generation try { var invoiceContent = new InvoiceContent { CustomerName = "John Doe", Address = "123 Main St, Anytown, USA", InvoiceItems = new List<InvoiceItem> { new InvoiceItem { Description = "Item 1", Price = 19.99M }, new InvoiceItem { Description = "Item 2", Price = 29.99M } } }; var pdfDocument = pdfService.GeneratePdf(invoiceContent); pdfDocument.SaveAs("C:\\TestInvoice.pdf"); Console.WriteLine("PDF generated successfully!"); } catch (Exception ex) { Console.WriteLine("Error generating PDF: " + ex.Message); } } } Imports System Imports System.Collections.Generic Public Class Program Shared Sub Main(ByVal args() As String) Dim pdfService As New PdfService() ' Test 1: Empty Customer Name Try Dim invoiceContent As New InvoiceContent With { .CustomerName = "", .Address = "123 Main St, Anytown, USA", .InvoiceItems = New List(Of InvoiceItem) From { New InvoiceItem With { .Description = "Item 1", .Price = 19.99D }, New InvoiceItem With { .Description = "Item 2", .Price = 29.99D } } } Dim pdfDocument = pdfService.GeneratePdf(invoiceContent) pdfDocument.SaveAs("C:\TestInvoice.pdf") Console.WriteLine("PDF generated successfully!") Catch ex As Exception Console.WriteLine("Error generating PDF: " & ex.Message) End Try ' Test 2: Empty InvoiceItems Try Dim invoiceContent As New InvoiceContent With { .CustomerName = "John Doe", .Address = "123 Main St, Anytown, USA", .InvoiceItems = New List(Of InvoiceItem)() } Dim pdfDocument = pdfService.GeneratePdf(invoiceContent) pdfDocument.SaveAs("C:\TestInvoice.pdf") Console.WriteLine("PDF generated successfully!") Catch ex As Exception Console.WriteLine("Error generating PDF: " & ex.Message) End Try ' Successful generation Try Dim invoiceContent As New InvoiceContent With { .CustomerName = "John Doe", .Address = "123 Main St, Anytown, USA", .InvoiceItems = New List(Of InvoiceItem) From { New InvoiceItem With { .Description = "Item 1", .Price = 19.99D }, New InvoiceItem With { .Description = "Item 2", .Price = 29.99D } } } Dim pdfDocument = pdfService.GeneratePdf(invoiceContent) pdfDocument.SaveAs("C:\TestInvoice.pdf") Console.WriteLine("PDF generated successfully!") Catch ex As Exception Console.WriteLine("Error generating PDF: " & ex.Message) End Try End Sub End Class $vbLabelText $csharpLabel In the code above, try-catch blocks are used to catch any exceptions that may occur. If an exception is caught, an error message will be shown to the user using Console.WriteLine. Now let's test this application with different scenarios to validate the PDF generation and the validation rules. Testing the Application In the code example, there are three scenarios to test: Empty customer name: Leave the customer name empty to trigger a validation error. Empty invoice items: Provide an empty list of invoice items to trigger a validation error. Successful generation: Provide valid content to generate the PDF successfully. Run the application and observe the output in the console. Error generating PDF: Validation failed: -- CustomerName: Customer name is required. Severity: Error Error generating PDF: Validation failed: -- InvoiceItems: At least one invoice item is required. Severity: Error PDF generated successfully! The output error in the Console The output PDF file As expected, validation errors are shown for the first two scenarios and a success message for the third scenario. Conclusion This tutorial explored Fluent Validation and how to use it with IronPDF to generate PDF documents. Starting by setting up a Console Application and defining the PDF content class. Then, created validation rules using Fluent Validation and tested the PDF generation with different scenarios. Fluent Validation provides a flexible and easy-to-use approach for validating objects in .NET applications. It allows you to define validation rules in a strongly typed manner, customize error messages, and handle validation errors gracefully. IronPDF Free Trial & Licensing Information offers a free trial, and the license starts from $499 per developer. 常見問題解答 如何在 C# 中將 Fluent Validation 與 PDF 生成整合? 要將 Fluent Validation 與 C# 中的 PDF 生成集成,您可以在 Visual Studio 中設定控制台應用程序,透過 NuGet 安裝 FluentValidation 和 IronPDF 包,並使用 Fluent Validation 定義模型驗證邏輯,同時使用 IronPDF 生成 PDF。 設定用於產生和驗證 PDF 的專案需要哪些步驟? 若要設定項目,請在 Visual Studio 中建立新的控制台應用程序,透過 NuGet 安裝 IronPDF 和 FluentValidation 套件,然後使用對應的庫定義 PDF 內容和驗證規則。 如何使用 .NET 函式庫從 HTML 內容產生 PDF? 您可以使用 IronPDF 的RenderHtmlAsPdf方法從 HTML 內容產生 PDF,該方法可讓您將 HTML 字串或檔案轉換為高品質的 PDF。 教程中 PdfService 類別的用途是什麼? 本教程中的 PdfService 類別旨在管理 PDF 生成,它首先使用 Fluent Validation 驗證內容。驗證成功後,它會使用 IronPDF 的ChromePdfRenderer和RenderHtmlAsPdf方法建立 PDF。 如何使用 Fluent Validation 定義驗證規則? Fluent Validation 中的驗證規則是透過建立一個繼承自AbstractValidator驗證器類別來定義的。 AbstractValidator在該類別中, RuleFor方法用於指定每個屬性的條件,從而允許自訂錯誤訊息和規則鏈。 如果在產生 PDF 檔案過程中驗證失敗會發生什麼情況? 如果驗證失敗,Fluent Validation 會拋出一個ValidationException ,其中包含有關驗證錯誤的詳細信息,可用於告知使用者哪裡出了問題。 我可以使用 Fluent Validation 進行複雜物件驗證嗎? 是的,Fluent Validation 支援透過使用子驗證器進行複雜物件驗證,讓您可以驗證模型中的巢狀屬性和集合。 如何在 Fluent Validation 中自訂錯誤訊息? 在 Fluent Validation 中,可以使用WithMessage方法為RuleFor指定的每個驗證規則定義自訂錯誤訊息。 PDF生成庫是否有試用版? 是的,IronPDF 為開發者提供免費試用版,用於測試庫的功能,授權選項起價為每位開發者 499 美元。 IronPDF 是否完全相容於 .NET 10? 是的。 IronPDF 完全相容於 .NET 10,並支援包括 Windows、Linux 和 macOS 在內的多種平台,以及各種專案類型(控制台、Web、桌面、Blazor 等)。它無需任何額外設定即可在最新的運行時環境中直接運作。 Curtis Chau 立即與工程團隊聊天 技術作家 Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。 相關文章 發表日期 11月 13, 2025 如何在 C# 中合併兩個 PDF 位元組數組 使用 IronPDF 在 C# 中合併兩個 PDF 位元組數組。學習如何透過簡單的程式碼範例,將來自位元組數組、記憶體流和資料庫的多個 PDF 文件合併在一起。 閱讀更多 發表日期 11月 13, 2025 如何在 ASP.NET MVC 中創建 PDF 檢視器 為 ASP.NET MVC 應用程式構建一個強大的 PDF 檢視器。顯示 PDF 文件,將視圖轉換為 PDF,使用 IronPDF 添加互動功能。 閱讀更多 發表日期 11月 13, 2025 如何建立 .NET HTML 轉 PDF 轉換器 學習如何在.NET中使用IronPDF將HTML轉換為PDF。 閱讀更多 PDF與PDFA(它對開發人員的作用)如何在C#開發人員中使用Cha...
發表日期 11月 13, 2025 如何在 C# 中合併兩個 PDF 位元組數組 使用 IronPDF 在 C# 中合併兩個 PDF 位元組數組。學習如何透過簡單的程式碼範例,將來自位元組數組、記憶體流和資料庫的多個 PDF 文件合併在一起。 閱讀更多
發表日期 11月 13, 2025 如何在 ASP.NET MVC 中創建 PDF 檢視器 為 ASP.NET MVC 應用程式構建一個強大的 PDF 檢視器。顯示 PDF 文件,將視圖轉換為 PDF,使用 IronPDF 添加互動功能。 閱讀更多