9.4 Blazor (客户端 Web UI 框架) 9.4 Blazor (客户端 Web UI 框架) Blazor 是一个使用 .NET 构建交互式客户端 Web UI 的框架。它允许开发者使用 C# 代替 JavaScript 来编写 Web 前端代码,并利用 .NET 的强大功能、工具和库。Blazor 提供了两种托管模型:Blazor WebAssembly 和 Blazor Server,分别在客户端浏览器和服务器端运行 .NET 代码。 9.4.1 Blazor 的优势 使用 C#: 避免 JavaScript,使用您已经熟悉的 .NET 语言编写 Web 前端。 共享代码: 可以在客户端和服务器端共享代码,例如数据模型、验证逻辑等。 .NET 生态系统: 利用 .
Current count: @currentCount
Click me @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } } ``` **9.4.3.2 组件参数** 组件可以接收参数,允许父组件向子组件传递数据。 ```csharp // MyComponent.razor@Message
@code { [Parameter] public string? Title { get; set; } [Parameter] public string? Message { get; set; } } ``` ```csharp // ParentComponent.razor ``` **9.4.3.3 事件处理** 组件可以处理用户事件,例如点击、鼠标移动等。 ```csharp // MyButton.razor @ButtonText @code { [Parameter] public string ButtonText { get; set; } = "Click me"; [Parameter] public EventCallback OnClick { get; set; } } ``` **9.4.3.4 组件生命周期** Blazor 组件具有生命周期方法,可以在组件的不同阶段执行代码。 * `OnInitialized`: 在组件初始化后调用。 * `OnParametersSet`: 在设置组件参数后调用。 * `OnAfterRender`: 在组件渲染后调用。 ### 9.4.4 数据绑定 Blazor 支持数据绑定,可以将 UI 元素的值绑定到 C# 代码中的变量。 **9.4.4.1 单向绑定** 将 C# 变量的值绑定到 UI 元素。 ```csharpValue: @myValue
@code { private string myValue = "Initial Value"; } ``` **9.4.4.2 双向绑定** 将 UI 元素的值绑定到 C# 变量,并且当 UI 元素的值发生变化时,C# 变量也会更新。 ```csharpValue: @myValue
@code { private string myValue = "Initial Value"; } ``` ### 9.4.5 依赖注入 Blazor 支持依赖注入,允许您将服务注入到组件中。 ```csharp // MyComponent.razor @inject IMyService MyServiceValue: @MyService.GetValue()
@code { } ``` ```csharp // IMyService.cs public interface IMyService { string GetValue(); } // MyService.cs public class MyService : IMyService { public string GetValue() { return "Service Value"; } } ``` 需要在 `Program.cs` 文件中注册服务: ```csharp // Program.cs (Blazor WebAssembly) builder.Services.AddScoped(); // Program.cs (Blazor Server) builder.Services.AddScoped(); ``` ### 9.4.6 JavaScript 互操作 Blazor 允许您与 JavaScript 代码进行互操作。 **9.4.6.1 从 C# 调用 JavaScript** 使用 `IJSRuntime` 服务从 C# 代码调用 JavaScript 函数。 ```csharp @inject IJSRuntime JSRuntime Call JavaScript @code { private async Task CallJavaScript() { await JSRuntime.InvokeVoidAsync("alert", "Hello from Blazor!"); } } ``` **9.4.6.2 从 JavaScript 调用 C#** 使用 `[JSInvokable]` 属性将 C# 方法暴露给 JavaScript 代码。 ```csharp // MyComponent.razor @inject IJSRuntime JSRuntime @code { [JSInvokable] public static string GetMessage() { return "Hello from C#!"; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await JSRuntime.InvokeVoidAsync("setMessage", DotNetObjectReference.Create(this)); } } } ``` ```javascript // JavaScript code function setMessage(dotNetHelper) { dotNetHelper.invokeMethodAsync('GetMessage') .then(message => alert(message)); } ``` ### 9.4.7 路由 Blazor 使用 `@page` 指令定义组件的路由。 ```csharp // MyPage.razor @page "/mypage"