在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
DotNetify 是一个使用 .NET 和 Blazor 制作的开源框架,用于在 .NET 平台上创建实时网络应用程序。 利用 SignalR 在客户端和服务器之间进行实时交互的强大功能,可以更轻松地构建动态和交互式网络应用程序。 DotNetify 是一种将客户端视图与.NET、Java、Python 或 Node js 同步的编程模型。服务器端脚本这些工具可帮助开发人员快速、轻松地设计出内容丰富、反应灵敏、性能卓越的在线界面。
相反,IronPDF PDF 生成库PDFManager 是一个功能强大的 .NET 软件包,可使 PDF 文档的创建、编辑和处理变得更加容易。 对于创建动态、数据驱动型文档(如报告、发票和表单)来说,这是一个不错的选择,因为它提供了直观的 API,可将 HTML 文本转换为 PDF。
通过将 DotNetify 与 IronPDF 集成,在 C# 应用程序中结合了实时网络交互性和强大的 PDF 制作功能。 需要实时显示数据并能根据最新数据动态创建和分发 PDF 文档的应用程序会发现这种集成特别有用。 开发人员可以利用 IronPDF 的多功能 PDF 生成功能和 DotNetify 的实时数据同步功能,设计广泛的交互式在线应用程序,满足复杂的业务需求,并通过无缝文档生成和分发改善用户体验。
DotNetifyBlazor 是一个开源框架,旨在使使用 .NET 和 Blazor 创建交互式实时网络应用程序变得更容易。 开发人员可以利用 SignalR 创建动态的响应式用户界面,并毫不费力地与服务器端数据同步,从而促进客户端与服务器之间的实时通信。 DotNetify 是一种反应式编程方法,它通过抽象实时数据绑定和事件处理的困难,用少量代码简化了复杂在线应用程序的创建。
为确保用户界面始终反映应用程序的状态,DotNetify 允许开发人员在服务器上构建视图模型,并立即将更改传播到客户端。 该框架允许灵活选择客户端技术,同时支持经典 JavaScript 前端和 Blazor 前端。 由于其易用性和有效性,它非常适合需要实时更新的应用程序,如仪表盘、协作工具和实时数据流。
DotNetify 可实时处理复杂的交互和数据流,实现流畅的数据同步和即时反馈,从而大大改善用户体验。 综上所述,DotNetify 对于希望快速有效地构建反应式、前沿、实时在线应用程序的 .NET 开发人员来说,是一个非常有用的解决方案。
C# 中的 DotNetify 提供的一系列功能使创建交互式实时在线应用程序变得更加容易。重要特性包括
实时通信: DotNetify 利用 SignalR 促进客户端和服务器之间的双向实时通信,从而实现交互式用户界面和快速更新。
反应式编程模型: 它提供了一种反应式编程方法,在这种方法中,客户端视图和服务器端视图模型自动同步,使用户界面与最新信息保持同步。
服务器端视图模型: 这使开发人员有可能创建服务器端视图模型,客户端组件可与之绑定,从而使应用程序内的状态管理和数据流更加简单。
Blazor和JavaScript支持:同时支持经典的JavaScript前端和Blazor前端,允许开发人员选择最符合其要求的客户端技术。
易于集成: 实时功能可与现有的 .NET 应用程序无缝集成,因此可轻松添加到新的或现有的项目中。 它还能很好地与 WebSockets 等前端 UI 组件框架集成,用于创建网络组件,并与使用 React Native、Vue 和 Blazor 等软件的项目配合使用。
可扩展性: DotNetify 基于 SignalR,继承了其可扩展性特点,使应用程序能够有效管理大量并发连接。
MVVM 架构: 支持模型-视图-视图模型(MVVM)此外,翻译还必须考虑到软件开发过程中的架构问题,这有助于责任分工以及代码组织的整洁和可维护性。
事件处理: 通过简化事件处理和数据绑定,减少处理用户界面交互和状态变化所需的模板代码量。
可扩展、可定制: 提供可扩展点和钩子,允许自定义行为并与其他库或框架进行必要的集成。
强大的基础架构: 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 PDF 库允许 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 并绑定其属性。 当用户点击 "生成 PDF "按钮时,该组件会调用 ViewModel 的方法、创建PDF并动态更新下载 URL。 通过这种配置,该网络应用程序将 IronPDF 强大的文档生成功能与 DotNetify 的实时数据同步功能整合在一起,从而提供了反应灵敏、引人入胜的用户体验。
通过将 DotNetify 与 IronPDF 集成,在 C# ASP.NET Core Blazor 应用程序中结合了实时数据同步和动态 PDF 制作。 DotNetify 可实现客户端 Blazor 组件与服务器端 ViewModels 之间的顺畅通信,从而使交互式和响应式应用程序成为可能。 IronPdf 提供了功能强大的工具,可直接从服务器端逻辑创建和修改 PDF,从而增强了上述功能。 在这种有效组合的帮助下,开发人员可以创建能够创建和发送独特文档以及实时更新的应用程序。
这种集成充分利用了实时数据处理和文档生成技术,以改善用户体验,无论是用于报告、开具发票还是任何其他与文档相关的操作。 开发人员可以按照所列步骤快速、轻松地设置和使用这些工具,这为当代网络应用程序开发开辟了广阔的天地。
您可以利用 IronPDF 和 IronPDF 的 OCR、Barcode 扫描、PDF 制作、Excel 连接等功能。IronSoftware 开发人员工具翻译的目的是让开发人员能够试用其丰富的功能。
如果能详细说明与项目相关的许可证备选方案,开发人员就能更轻松地选择最佳模式。 上述优势有助于开发人员针对各种问题及时、协调、有效地实施解决方案。