在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
DotNetify 是一個使用 .NET 和 Blazor 製作的開源框架,旨在建立基於 .NET 平台的實時 web 應用程式。利用 SignalR 的實時互動功能,使客戶端和伺服器之間的互動更加簡單,便於構建動態和交互式的 web 應用程式。DotNetify 是一種程式設計模型,用於同步客戶端視圖與 伺服器端 數據,讓開發者能夠快速且輕鬆地設計豐富、響應迅速且高效的線上界面。
相反地, IronPDF 是一個強大的 .NET 套件,能夠讓程式化地創建、編輯和操作 PDF 文件變得更容易。由於它提供了一個直觀的 API 來將 HTML 文本轉換為 PDF,非常適合創建動態、數據驅動的文檔,如報告、發票和表單。
通過將 DotNetify 與 IronPDF 集成,C# 應用程序結合了實時網頁交互和強大的 PDF 生成能力。這種集成對於需要實時數據顯示並能夠基於最新數據動態創建和分發 PDF 文檔的應用程序特別有用。開發人員可以利用 IronPDF 的多功能 PDF 生成和 DotNetify 的實時數據同步,設計出滿足複雜業務需求並改善用戶體驗的全面、互動的網頁應用程序,實現無縫的文檔生成和分發。
DotNetify 是一個開源框架,旨在簡化使用 .NET 和 Blazor 創建互動實時網頁應用程式的過程。開發人員可以利用 SignalR 來促進客戶端和伺服器之間的實時通信,從而輕鬆地創建與伺服器數據同步的動態且響應式的用戶界面。DotNetify 是一種反應式編程方法,通過抽象化實時數據綁定和事件處理的複雜性,簡化了復雜的網絡應用程式創建,所需代碼較少。
為了保證使用者介面始終代表應用程式的狀態,DotNetify 允許開發人員在伺服器上構建視圖模型,並立即將更改傳播到客戶端。這個框架允許選擇客戶端技術的靈活性,支援傳統的 JavaScript 前端和 Blazor 前端。由於其易用性和有效性,它非常適合需要實時更新的應用程式,例如儀表板、協作工具和即時資料流。
DotNetify 的即時處理複雜交互和資料流動大大改善了使用者體驗,實現了平滑的資料同步和即時反饋。總體而言,對於希望快速和有效地構建反應式、先進且即時網絡應用程式的 .NET 開發人員來說,DotNetify 是一個有用的解決方案。
DotNetify 提供的多項功能,使得在 C# 中創建互動、實時的網絡應用變得更加簡單。其重要特性包括:
實時通信: DotNetify 使用 SignalR 來促進客戶端和服務器之間的雙向實時通信,實現交互式用戶界面和快速更新。
響應式編程模型: 它提供了一種響應式編程方法,客戶端的視圖和服務器端的視圖模型會自動同步,以便使用戶界面與最新信息保持一致。
服務器端視圖模型: 這使得開發者能夠創建服務器端的視圖模型,客戶端組件可以綁定到這些模型,從而簡化應用中的狀態管理和數據流。
支持 Blazor 和 JavaScript: 支持傳統的 JavaScript 前端和 Blazor 前端,允許開發者選擇最符合其需求的客戶端技術。
易於集成: 實時功能可以輕鬆添加到新項目或現有項目中,並且與現有的 .NET 應用程序無縫集成。它還與前端 UI 組件框架(如 WebSockets)集成良好,用於創建 web 組件,也適用於使用 React Native、Vue 和 Blazor 等軟件的項目。
可擴展性: 基於 SignalR 的 DotNetify 繼承了其可擴展性特徵,使應用程序能夠有效地管理大量並發連接。
MVVM 架構: 支持模型-視圖-視圖模型(MVVM)架構 (MVVM) 架構,有助於職責分工以及代碼的乾淨、可維護性組織。
事件處理: 通過簡化事件處理和數據綁定,減少處理 UI 交互和狀態變更所需的樣板代碼量。
可擴展和可定制: 提供擴展點和掛鉤,允許行為定制和必要的與其他庫或框架的集成。
強大的基礎設施: DotNetify 基礎設施提供了一個動態路由機制,可以完全在後端定義,並且支持嵌套路由、基於令牌的身份驗證等。
開源和社區驅動: DotNetify 是一個開源項目,受益於社區的參與和貢獻,這保證了持續的升級和改進。
要建立一個簡單的專案並開始在 C# 線上應用程式中配置 DotNetify,請按以下步驟進行。本教程將向您展示如何使用 ASP.NET Core 和 Blazor 設置一個基本的 DotNetify 伺服器和客戶端。
要配置 DotNetify,請打開 Startup.cs 並使用 ConfigureServices 和 Configure 方法。
using DotNetify;
using DotNetify.Blazor;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSignalR();
services.AddDotNetify();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
endpoints.MapHub<DotNetifyHub>("/dotnetify");
});
}
}
using DotNetify;
using DotNetify.Blazor;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSignalR();
services.AddDotNetify();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
endpoints.MapHub<DotNetifyHub>("/dotnetify");
});
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
在您的專案中建立一個新的類別檔案 (例如,HelloWorldViewModel.cs) 設計一個基本的 ViewModel。
using DotNetify;
public class HelloWorldViewModel : BaseVM
{
public string Greetings => "Hello, World!";
}
using DotNetify;
public class HelloWorldViewModel : BaseVM
{
public string Greetings => "Hello, World!";
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
在註冊 ViewModel 之前,打開 Program.cs。
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
services.AddTransient<HelloWorldViewModel>();
});
}
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
services.AddTransient<HelloWorldViewModel>();
});
}
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.DependencyInjection
Imports Microsoft.Extensions.Hosting
Public Class Program
Public Shared Sub Main(ByVal args() As String)
CreateHostBuilder(args).Build().Run()
End Sub
Public Shared Function CreateHostBuilder(ByVal args() As String) As IHostBuilder
Return Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(Sub(webBuilder)
webBuilder.UseStartup(Of Startup)()
End Sub).ConfigureServices(Sub(services)
services.AddTransient(Of HelloWorldViewModel)()
End Sub})
End Function
在您的專案中,新增一個 Blazor 元件 (例如 HelloWorld.razor) 並將其連接到 ViewModel。
@page "/"
@using DotNetify
@using DotNetify.Blazor
@inject IDotNetifyService DotNetify
<h3>@greetings</h3>
@code {
private string greetings;
protected override async Task OnInitializedAsync()
{
var vm = await DotNetify.ConnectAsync<HelloWorldViewModel>(this);
greetings = vm.Greetings;
}
}
@page "/"
@using DotNetify
@using DotNetify.Blazor
@inject IDotNetifyService DotNetify
<h3>@greetings</h3>
@code {
private string greetings;
protected override async Task OnInitializedAsync()
{
var vm = await DotNetify.ConnectAsync<HelloWorldViewModel>(this);
greetings = vm.Greetings;
}
}
'INSTANT VB TODO TASK: The following line could not be converted:
page "/" [using] DotNetify [using] DotNetify.Blazor inject IDotNetifyService DotNetify (Of h3) greetings</h3> code
If True Then
private String greetings
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
' protected override async Task OnInitializedAsync()
' {
' var vm = await DotNetify.ConnectAsync<HelloWorldViewModel>(Me);
' greetings = vm.Greetings;
' }
End If
設置應用程序以使用DotNetify、Blazor、Razor Pages和SignalR。此外,還配置DotNetify和Blazor端點和路由。描述了一個帶有返回問候訊息屬性的基本ViewModel。HelloWorldViewModel被註冊為臨時服務。Blazor組件建立與HelloWorldViewModel的連接,獲取歡迎訊息,並將其顯示在屏幕上。
你必須建立一個 .NET 專案並將 DotNetify 和 IronPDF 兩個庫整合到你的應用程式中。以下是一個逐步操作的教學指南,幫助你開始:
功能豐富的 .NET 庫 IronPDF 允許C#程序生成、讀取和編輯PDF文檔。通過該程序,開發人員可以快速將HTML、CSS和JavaScript信息轉換為高質量、可打印的PDF文檔。最重要的任務包括添加頁眉和頁腳、拆分和合併PDF、給文檔添加水印以及將HTML轉換為PDF。
IronPDF支持.NET Framework和.NET Core,因此對各種應用程序都很有幫助。由於PDF易於使用且信息豐富,開發人員可以輕鬆將其集成到他們的產品中。由於IronPDF可以處理複雜的數據佈局和格式,所生成的PDF輸出與客戶的原始HTML文本非常相似。IronPDF還支持跨平台應用程序,如Windows、網絡和移動環境。
從HTML生成PDF
將JavaScript, HTML和CSS轉換為PDF。IronPDF支持媒體查詢和響應式設計,這是兩個當代的網頁標準。它對現代網頁標準的支持有助於使用HTML和CSS動態裝飾PDF賬單、報告和文件。
PDF編輯
可以在現有的PDF中添加文字、圖片和其他內容。開發人員可以使用IronPDF從PDF文件中提取文字和圖片,將多個PDF合併為一個文件,將PDF文件分成多個單獨的文檔,並添加水印、註釋、頁眉和頁腳。
PDF轉換
將多種文件格式(包括Word、Excel和圖片文件)轉換為PDF格式。IronPDF還支持PDF轉換為圖片。 (PNG,JPEG 等。).
效能和可靠性
高效能和可靠性是工業環境中期望的設計特性。使用IronPDF,開發人員可以輕鬆管理大型文件集。
若要獲得在 .NET 專案中處理 PDF 所需的工具,請安裝 IronPDF 套件。
dotnet add package IronPdf
dotnet add package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'dotnet add package IronPdf
配置 DotNetify
啟動配置:打開 Startup.cs,然後使用 ConfigureServices 和 Configure 方法來設置 DotNetify。
using DotNetify;
using DotNetify.Blazor;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSignalR();
services.AddDotNetify();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
endpoints.MapHub<DotNetifyHub>("/dotnetify");
});
}
}
using DotNetify;
using DotNetify.Blazor;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSignalR();
services.AddDotNetify();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
endpoints.MapHub<DotNetifyHub>("/dotnetify");
});
}
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
在您的專案中新增一個類別檔案 (例如 PdfViewModel.cs) 並創建一個 ViewModel 來生成 PDF。
using DotNetify;
using IronPdf;
public class PdfViewModel : BaseVM
{
public string PdfUrl { get; set; }
public void GeneratePdf()
{
var Renderer = new ChromePdfRenderer();
var PdfDocument = Renderer.RenderHtmlAsPdf("<h1>Hello World!</h1>");
var OutputPath = "wwwroot/PdfFiles/HelloWorld.pdf";
PdfDocument.SaveAs(OutputPath);
PdfUrl = "/PdfFiles/HelloWorld.pdf";
Changed(nameof(PdfUrl));
}
}
using DotNetify;
using IronPdf;
public class PdfViewModel : BaseVM
{
public string PdfUrl { get; set; }
public void GeneratePdf()
{
var Renderer = new ChromePdfRenderer();
var PdfDocument = Renderer.RenderHtmlAsPdf("<h1>Hello World!</h1>");
var OutputPath = "wwwroot/PdfFiles/HelloWorld.pdf";
PdfDocument.SaveAs(OutputPath);
PdfUrl = "/PdfFiles/HelloWorld.pdf";
Changed(nameof(PdfUrl));
}
}
Imports DotNetify
Imports IronPdf
Public Class PdfViewModel
Inherits BaseVM
Public Property PdfUrl() As String
Public Sub GeneratePdf()
Dim Renderer = New ChromePdfRenderer()
Dim PdfDocument = Renderer.RenderHtmlAsPdf("<h1>Hello World!</h1>")
Dim OutputPath = "wwwroot/PdfFiles/HelloWorld.pdf"
PdfDocument.SaveAs(OutputPath)
PdfUrl = "/PdfFiles/HelloWorld.pdf"
Changed(NameOf(PdfUrl))
End Sub
End Class
將新的 Blazor 元件添加到您的專案中 (例如 GeneratePdf.razor) 並將其綁定到 ViewModel 以創建 Blazor 元件。
@page "/"
@using DotNetify
@using DotNetify.Blazor
@inject IDotNetifyService DotNetify
<PageTitle>Generate PDF</PageTitle>
<h3>Generate PDF</h3>
<button @onclick="GeneratePdf">Generate PDF</button>
@if (!string.IsNullOrEmpty(pdfUrl))
{
<a href="@pdfUrl" target="_blank">Download PDF</a>
}
@code {
private string pdfUrl;
protected override async Task OnInitializedAsync()
{
var vm = await DotNetify.ConnectAsync<PdfViewModel>(this);
pdfUrl = vm.PdfUrl;
vm.PropertyChanged += (sender, args) =>
{
if (args.PropertyName == nameof(vm.PdfUrl))
{
pdfUrl = vm.PdfUrl;
StateHasChanged();
}
};
}
private void GeneratePdf()
{
DotNetify.CallMethod("GeneratePdf");
}
}
@page "/"
@using DotNetify
@using DotNetify.Blazor
@inject IDotNetifyService DotNetify
<PageTitle>Generate PDF</PageTitle>
<h3>Generate PDF</h3>
<button @onclick="GeneratePdf">Generate PDF</button>
@if (!string.IsNullOrEmpty(pdfUrl))
{
<a href="@pdfUrl" target="_blank">Download PDF</a>
}
@code {
private string pdfUrl;
protected override async Task OnInitializedAsync()
{
var vm = await DotNetify.ConnectAsync<PdfViewModel>(this);
pdfUrl = vm.PdfUrl;
vm.PropertyChanged += (sender, args) =>
{
if (args.PropertyName == nameof(vm.PdfUrl))
{
pdfUrl = vm.PdfUrl;
StateHasChanged();
}
};
}
private void GeneratePdf()
{
DotNetify.CallMethod("GeneratePdf");
}
}
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'@page "/" @using DotNetify @using DotNetify.Blazor @inject IDotNetifyService DotNetify (Of PageTitle) Generate PDF</PageTitle> (Of h3) Generate PDF</h3> <button @onclick="GeneratePdf"> Generate PDF</button> @if(!string.IsNullOrEmpty(pdfUrl))
'{
' <a href="@pdfUrl" target="_blank"> Download PDF</a>
'}
code
If True Then
private String pdfUrl
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
' protected override async Task OnInitializedAsync()
' {
' var vm = await DotNetify.ConnectAsync<PdfViewModel>(Me);
' pdfUrl = vm.PdfUrl;
' vm.PropertyChanged += (sender, args) =>
' {
' if (args.PropertyName == nameof(vm.PdfUrl))
' {
' pdfUrl = vm.PdfUrl;
' StateHasChanged();
' }
' };
' }
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
' private void GeneratePdf()
' {
' DotNetify.CallMethod("GeneratePdf");
' }
End If
透過在C# ASP.NET Core Blazor應用程式中整合DotNetify和IronPDF,實現即時資料處理和動態PDF生產。啟用伺服器端Blazor和即時功能的第一步是在Startup.cs中配置項目,註冊Razor Pages、Blazor Server、SignalR和DotNetify的服務。
IronPDF的PDF生成邏輯定義在PdfViewModel.cs的ViewModel中。只需要幾行代碼即可生成PDF文件。其功能之一是GeneratePdf函數,該函數接收HTML信息並將其轉換為PDF。它將文件存儲在伺服器上,並更新PdfUrl屬性以通知客戶端新文件的位置。該ViewModel與GeneratePdf.razor Blazor元件通信。
為了使客戶端能夠調用GeneratePdf函數並對屬性變更做出反應,它通過IDotNetifyService連接到PdfViewModel並綁定到其屬性。當用戶點擊「生成PDF」按鈕時,該組件會調用ViewModel的方法。 創建PDF。 並動態更新下載 URL。透過這個配置,該 web 應用程式將 IronPDF 強大的文件生成功能與 DotNetify 的實時數據同步功能結合,提供了響應迅速且引人入勝的用戶體驗。
通過整合 DotNetify 和 IronPDF,在 C# ASP.NET Core Blazor 應用程式中實現實時數據同步和動態 PDF 生成。DotNetify 使客戶端 Blazor 組件和服務器端 ViewModels 之間能夠順暢通信,從而使交互式和響應式應用程式成為可能。IronPDF 增強了這一點,為直接從服務器端邏輯創建和修改 PDF 提供了強大的工具。利用這個強大的組合,開發人員可以創建能夠實時生成和發送獨特文件的應用程序。
這種整合最大限度地利用了實時數據處理和文件生成技術,以改善用戶體驗,無論是用於報告、發票還是任何其他與文件相關的操作。開發人員可以按照列出的步驟快速輕鬆地設置和使用這些工具,從而為現代 Web 應用程式開發開闢了一個新的可能性世界。
藉助 IronPDF,您可以利用光學字符識別(OCR)、條碼掃描、PDF 生成、Excel 連接等功能。 IronSoftware 為了讓開發人員試用其廣泛的功能集。
提供與項目相關的授權替代方案會詳細說明,使開發人員更容易選擇最佳模式。上述優點促進了開發人員對各種問題進行及時、有序和有效的解決方案實施。