在生产环境中测试,无水印。
随时随地满足您的需求。
获得30天的全功能产品。
几分钟内就能启动并运行。
在您的产品试用期间,全面访问我们的支持工程团队。
DotNetify 是一个使用 .NET 和 Blazor 制作的开源框架,用于在 .NET 平台上创建实时网络应用程序。 利用 SignalR 在客户端和服务器之间进行实时交互的强大功能,可以更轻松地构建动态和交互式网络应用程序。 DotNetify 是一种编程模型,它将客户端视图与服务器端脚本数据同步,使开发人员可以快速轻松地设计丰富、响应迅速且性能优越的在线界面。
相反,IronPDF PDF Generation Library 是一个强大的 .NET 包,使程序化地创建、编辑和操作 PDF 文档变得更加容易。 对于创建动态、数据驱动型文档(如报告、发票和表单)来说,这是一个不错的选择,因为它提供了直观的 API,可将 HTML 文本转换为 PDF。
通过将 DotNetify 与 IronPDF 集成,在 C# 应用程序中结合了实时网络交互性和强大的 PDF 制作功能。 需要实时显示数据并能根据最新数据动态创建和分发 PDF 文档的应用程序会发现这种集成特别有用。 开发人员可以利用 IronPDF 的多功能 PDF 生成功能和 DotNetify 的实时数据同步功能,设计广泛的交互式在线应用程序,满足复杂的业务需求,并通过无缝文档生成和分发改善用户体验。
DotNetify 是一个开源框架,用于简化使用 .NET 和 Blazor 创建交互式实时 web 应用程序的过程。 开发人员可以利用 SignalR 创建动态的响应式用户界面,并毫不费力地与服务器端数据同步,从而促进客户端与服务器之间的实时通信。 DotNetify 是一种反应式编程方法,它通过抽象实时数据绑定和事件处理的困难,用少量代码简化了复杂在线应用程序的创建。
为确保用户界面始终反映应用程序的状态,DotNetify 允许开发人员在服务器上构建视图模型,并立即将更改传播到客户端。 该框架允许灵活选择客户端技术,同时支持经典 JavaScript 前端和 Blazor 前端。 由于其易用性和有效性,它非常适合需要实时更新的应用程序,如仪表盘、协作工具和实时数据流。
DotNetify 可实时处理复杂的交互和数据流,实现流畅的数据同步和即时反馈,从而大大改善用户体验。 综上所述,DotNetify 对于希望快速有效地构建反应式、前沿、实时在线应用程序的 .NET 开发人员来说,是一个非常有用的解决方案。
C# 中的 DotNetify 提供的一系列功能使创建交互式实时在线应用程序变得更加容易。重要特性包括
实时通信:DotNetify 使用 SignalR 来促进客户端和服务器之间的双向实时通信,从而实现交互式用户界面和快速更新。
响应式编程模型:它提供了一种响应式编程方法,其中客户端视图和服务器端视图模型自动同步,以确保用户界面始终与最新信息保持一致。
服务器端视图模型: 这使开发人员可以创建服务器端视图模型,客户端组件可以绑定到这些模型,从而简化应用程序内的状态管理和数据流动。
Blazor 和 JavaScript 支持:支持经典的 JavaScript 前端和 Blazor 前端,允许开发人员选择最符合其要求的客户端技术。
易于集成:由于它与现有.NET应用程序的无缝集成,可以轻松将实时功能添加到新项目或现有项目中。 它还能很好地与 WebSockets 等前端 UI 组件框架集成,用于创建网络组件,并与使用 React Native、Vue 和 Blazor 等软件的项目配合使用。
可扩展性:基于SignalR的DotNetify继承了其可扩展性特性,使应用程序能够有效管理大量并发连接。
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),并设计一个基本的视图模型。
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 PDF Library允许C#程序生成、读取和编辑PDF文档。 通过该程序,开发人员可以快速将 HTML、CSS 和 JavaScript 信息转化为高质量、可打印的 PDF 文件。 最关键的任务包括添加页眉和页脚、分割和合并 PDF、为文档添加水印以及将 HTML 转换为 PDF。
IronPDF 支持 .NET Framework 和 .NET Core,因此对各种应用都有帮助。 PDF 使用简单,信息丰富,开发人员可以轻松地将其集成到自己的产品中。 由于 IronPDF 可以处理复杂的数据布局和格式,因此其生成的 PDF 输出与客户的原始 HTML 文本非常相似。 IronPdf 还支持 Windows、Web 和移动环境等跨平台应用程序。
从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 for .NET 软件包。
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),并创建一个将生成 PDF 的 ViewModel。
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 视图模型中。 只需几行代码就足以生成 PDF 文件。其功能之一是 GeneratePdf 函数,该函数可获取 HTML 信息并将其转化为 PDF。 它将文件存储在服务器上,并更新 PdfUrl 属性,让客户端知道新文件在哪里。 该 ViewModel 与 GeneratePdf.razor Blazor 组件通信。
为了使客户端能够调用 GeneratePdf 函数并对属性变化做出反应,它通过 IDotNetifyService 连接到 PdfViewModel 并绑定其属性。 当用户点击“Generate PDF”按钮时,组件会调用ViewModel的方法,创建PDF并动态更新下载URL。 通过这种配置,该网络应用程序将 IronPDF 强大的文档生成功能与 DotNetify 的实时数据同步功能整合在一起,从而提供了反应灵敏、引人入胜的用户体验。
通过将 DotNetify 与 IronPDF 集成,在 C# ASP.NET Core Blazor 应用程序中结合了实时数据同步和动态 PDF 制作。 DotNetify 可实现客户端 Blazor 组件与服务器端 ViewModels 之间的顺畅通信,从而使交互式和响应式应用程序成为可能。 IronPdf 提供了功能强大的工具,可直接从服务器端逻辑创建和修改 PDF,从而增强了上述功能。 在这种有效组合的帮助下,开发人员可以创建能够创建和发送独特文档以及实时更新的应用程序。
这种集成充分利用了实时数据处理和文档生成技术,以改善用户体验,无论是用于报告、开具发票还是任何其他与文档相关的操作。 开发人员可以按照所列步骤快速、轻松地设置和使用这些工具,这为当代网络应用程序开发开辟了广阔的天地。
对于希望尝试丰富功能集的开发者,您可以利用IronPDF和Iron Software Developer Tools进行OCR、条形码扫描、PDF制作、Excel连接以及更多功能。
如果能详细说明与项目相关的许可证备选方案,开发人员就能更轻松地选择最佳模式。 上述优势有助于开发人员针对各种问题及时、协调、有效地实施解决方案。