001.Blazor简介

lazor 是由微软开发的一个开源 Web 框架,它允许开发者使用 C#.NET 来构建交互式的客户端 Web 用户界面,而无需编写大量的 JavaScript。

简单来说,Blazor 的核心目标是让后端开发人员能够利用他们熟悉的 .NET 生态系统(语言、库、工具)来完成前端开发。


Blazor 的主要特点

  1. 使用 C# 代替 JavaScript: 你可以直接在 Razor 组件中使用 C# 代码来处理逻辑、事件和数据绑定。
  2. 代码共享: 由于前后端都使用 .NET,你可以轻松地在客户端和服务器端之间共享模型(Models)、验证逻辑和工具类。
  3. 基于组件的架构 : Blazor 使用 Razor 组件(.razor 文件)来构建 UI。每个组件都是一个自包含的 UI 单元,包含 HTML 标记和 C# 代码。
  4. 强大的生态系统: 你可以使用 NuGet 包管理器来引入现有的 .NET 库,并利用 Visual Studio 等强大的 IDE 进行开发和调试。

Blazor 的两种主要托管模式

Blazor 主要分为两种运行方式,它们决定了代码在哪里执行:

1. Blazor WebAssembly (WASM)
  • 运行位置:代码直接在用户的浏览器中运行。
  • 原理:它将 .NET 运行时编译为 WebAssembly,并在浏览器沙箱中执行。
  • 优点:离线能力强,减轻服务器负载,响应速度快。
  • 缺点:首次加载时需要下载较大的运行时和程序集文件。
2. Blazor Server
  • 运行位置:代码在服务器上运行。
  • 原理 :通过 SignalR(实时长连接)与浏览器进行通信。浏览器发送 UI 事件(如点击按钮),服务器处理后将 UI 更新推回浏览器。
  • 优点:首屏加载极快,代码完全在服务器端,安全性更高。
  • 缺点:由于依赖长连接,网络延迟会直接影响用户体验,且服务器需要维护每个用户的连接状态。

另外两种非主流模式

3.无交互性(静态页面模式)

这种模式是基础,即每个页面都是只浏览显示的模式,不需要ui与后台数据交互,页面可以写在本地也可以从服务器访问得到,这些页面都是静态的

4.混合模式

这是我们主要的学习方向,他可以跨平台,如安卓,电脑等等设备运行

二.新建Blazor web app程序

1.模式的选择

在新建程序时,这四个选项就是我们前面介绍的四种模式,一般情况下我们都是选择无(无交互性)模式开始,这种模式是所有blazor入门的基础,后面如果需要交互性我们可以自己再加上去

2.项目文件的基本结构

一个Blazor web app项目主要文件结构如下图,Program.cs是主程序入口,App.razor是根组件文件,Routes.razor是路由组件文件, Layout文件夹是布局文件夹,里面包含主布局文件,Pages是组件文件夹,包含所有组件(页面),_imports.razor文件为全局命名空间引用文件

在Blazor,所有页面还是控制器文件都被称之为组件,他们都是如下图所示是Razor组件,格式都是.razor,可以看到,上图的所有文件其实都是一个Razor页面文件,具体是做为显示页面还是控制器等等,功能都是由我们自己写的,定的,但在Blazor中他们通通都称为组件

3.Blazor程序的运行规则

3.1.从主程序Program.cs开始

App.Run()方法会循环监听是否有http请求,如果有就会自动去匹配请求的URL路由页面

cs 复制代码
using BlazorApp1.Components;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseAntiforgery();

app.MapStaticAssets();
app.MapRazorComponents<App>();

app.Run();
3.2.根组件App.razor

上面主程序app对象运行的其实是根组件文件App.razor,根组件代码中核心部分是<bady>标签内的内容,他执行了<Routes/>和一个 .js文件,

<Routes/>就是上面所说的Routes.razor是路由组件文件,也就是说,app文件会根据http请求的URL,执行这个路由匹配组件Routes.razor找到用户所需要的页面文件,下面的<script>标签内的内容是程序全自动自己匹配生成的内部文件,他是必须存在的,照写就行,不需要理解他是什么意思

cs 复制代码
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <base href="/" />
    <ResourcePreloader />
    <link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" />
    <link rel="stylesheet" href="@Assets["app.css"]" />
    <link rel="stylesheet" href="@Assets["BlazorApp1.styles.css"]" />
    <ImportMap />
    <link rel="icon" type="image/png" href="favicon.png" />
    <HeadOutlet />
</head>

<body>
    <Routes />
    <script src="@Assets["_framework/blazor.web.js"]"></script>
</body>

</html>
3.3.Routes.razor路由组件

路由组件会根据http请求的URL去查找匹配的页面,并将匹配到的页面按主布局文件Layout.MainLayout的格式,显示出来

cs 复制代码
<Router AppAssembly="typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
    <Found Context="routeData">
        <RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
        <FocusOnNavigate RouteData="routeData" Selector="h1" />
    </Found>
</Router>

http请求的url它会去哪里找,找到谁?

假设在浏览器请求http://localhost:5189/,,,,,,,localhost:5189是我们实际的端口后,在http请求中可能替换为80端口,斜杆/就是我们请求的url

知道了浏览器http请求的url是一个/,那他就会去寻找一个 @page "/"定义的组件,这些组件一般都在Components文件夹或Pages文件夹内,在编程规范中,可路由文件(用@page去调用的文件 )都规定放在Pages文件内,可重复调用的控件(没有@page标签)要求都放在Components文件夹

,由此可见,http请求的URL会去Pages文件夹内找到这个@page "/"定义的组件(页面)

点进Home.razor文件看看,他就是定义为@page "/",浏览器请求的URL就是会匹配到这个页面,他会反馈给浏览器显示出来

cs 复制代码
@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.
3.4.如何反馈给浏览器显示出来

他不会直接把Home.razor给到浏览器去显示出来,因为这样子的话,每个页面文件显示的格式都不一样,会非常乱,或者说,每个页面都需要一个.css文件去装饰,为了使整个app页面都有一个规范的界面,这个匹配到的Home页面内容会被拿来替换为主布局文件bady标签内

到了这里,所有http请求找到的page组件都会以主布局文件规定的样式显示在浏览器上,即主布局文件写好的样式其实是下图这样的,左边有一个侧边栏,右边有一个div,浏览器请求到的url匹配页面内容都会被映射到右边的div内显示出来

再看看我们Home.razor组件内容,他就是浏览器所显示的内容

cs 复制代码
@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.
相关推荐
工程师0072 小时前
C# 程序集、IL、CLR 执行流程
c#·clr·il·程序集
xxjj998a2 小时前
PHP vs C#:核心差异全解析
开发语言·c#·php
我不在你不在4 小时前
C# 异步与LINQ实战亮点
c#
游乐码4 小时前
c#预处理器指令
c#
之歆4 小时前
DAY13_CSS3进阶完全指南 —— 背景、边框、文本、渐变、滤镜与 Web 字体(上)
前端·c#·css3
工程师00713 小时前
C# 装箱、拆箱 底层原理
c#·装箱和拆箱
清风明月一壶酒14 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
工程师00717 小时前
C# 值类型 / 引用类型 内存布局(栈、堆、托管堆)
c#·值类型与引用类型
chao18984419 小时前
完整MES系统实现 (C# 客户端服务器)
服务器·windows·c#