Blazor 基础知识

Intro

Blazor 是微软在 .NET 里推出的一个 WEB 客户端 UI 交互的框架,

使用 Blazor 你可以代替 JavaScript 来实现自己的页面交互逻辑,可以很大程度上进行 C# 代码的复用,Blazor 对于 .NET 开发人员来说是一个不错的选择。

托管模型

Blazor 有两种托管模式,一种是 Blazor Server 模式,基于 asp.net core 部署,客户端和服务器的交互通过 SignalR 来完成,来实现客户端 UI 的更新和行为的交互。

Blazor Server runs .NET code on the server and interacts with the Document Object Model on the client over a SignalR connection

Blazor Server

另外一种是 Blazor WebAssembly 模式, 将 Blazor 应用、其依赖项以及 .NET 运行时下载到浏览器, 应用将在浏览器线程中直接执行。

Blazor WebAssembly runs .NET code in the browser with WebAssembly.

Blazor WebAssembly

两种模式各有优缺点,但是个人觉得 WebAssembly 模式的 Blazor 意义更大一些

Blazor Server 托管模型具有以下优点:

  • 下载项大小明显小于 Blazor WebAssembly 应用,且应用加载速度快得多。

  • 应用可充分利用服务器功能,包括使用任何与 .NET Core 兼容的 API。

  • 服务器上的 .NET Core 用于运行应用,因此调试等现有 .NET 工具可按预期正常工作。

  • 支持瘦客户端。例如,Blazor Server 应用适用于不支持 WebAssembly 的浏览器以及资源受限的设备。

  • 应用的 .NET/C# 代码库(其中包括应用的组件代码)不适用于客户端。

Blazor Server 托管模型具有以下局限性:

  • 通常延迟较高。每次用户交互都涉及到网络跃点。

  • 不支持脱机工作。如果客户端连接失败,应用会停止工作。

  • 如果具有多名用户,则应用扩缩性存在挑战。服务器必须管理多个客户端连接并处理客户端状态(SignalR)。

  • 需要 ASP.NET Core 服务器为应用提供服务。无服务器部署方案不可行,例如通过内容分发网络 (CDN) 为应用提供服务的方案。

Blazor WebAssembly 托管模型具有以下优点:

  • 没有 .NET 服务器端依赖,应用下载到客户端后即可正常运行。

  • 可充分利用客户端资源和功能。

  • 工作可从服务器转移到客户端。

  • 无需 ASP.NET Core Web 服务器即可托管应用。无服务器部署方案可行,例如通过内容分发网络 (CDN) 为应用提供服务的方案。

Blazor WebAssembly 托管模型具有以下局限性:

  • 应用仅可使用浏览器功能。

  • 需要可用的客户端硬件和软件(例如 WebAssembly 支持)。

  • 下载项大小较大,应用加载耗时较长。

  • .NET 运行时和工具支持不够完善。例如,.NET Standard 支持和调试方面存在限制。

项目结构

Blazor 结合了 Razor Page 的开发模式,可以使用 Razor 的语法,文件结构也和 Razor Page 的模式有些类似

Blazor 是以组件为核心的,页面所有的部分都是一个组件

Blazor WebAssembly 对应的 SDK 是 Microsoft.NET.Sdk.BlazorWebAssembly,来看一下具体的项目文件:

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"><PropertyGroup><TargetFramework>net6.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.0-preview.4.21253.5" /><PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.0-preview.4.21253.5" PrivateAssets="all" /></ItemGroup></Project>
project-structure
  • App.razor: Blazor WebAssembly 应用根组件

  • Program.cs: 配置应用 WebAssembly host 的入口文件

  • _Imports.razor: 和 Razor Page 一样,可以在这里定义一些 Razor Page 或者组件里公用的 namespace

  • Pages:包含可以路由到的页面,page 需要使用 @page 指令指定

  • Shared:包含一些公共的组件或者样式定义

  • wwwroot: 应用公共静态文件的根目录

Routing

在页面组件上通过 @page 指令指定页面路由 @page "/path",就会生成一个 RouteAttribute 以支持路由,路由支持像 asp.net core 一样的路由约束和 Path 参数

@page "/RouteParameter/{text}"<h1>Blazor is @Text!</h1>@code {[Parameter]public string Text { get; set; }
}
@page "/RouteParameter/{text?}"<h1>Blazor is @Text!</h1>@code {[Parameter]public string Text { get; set; }protected override void OnInitialized(){Text = Text ?? "fantastic";}
}
@page "/user/{Id:int}"<h1>User Id: @Id</h1>@code {[Parameter]public int Id { get; set; }
}

Catch-all

@page "/catch-all/{*pageRoute}"@code {[Parameter]public string PageRoute { get; set; }
}

Interop

Model Binding

最基本的我们需要了解如何做数据绑定,

<div><input type="checkbox" checked="@item.IsCompleted" /><h4>@item.TodoTitle</h4> -- <span class="small">@item.CreatedTime.ToStandardTimeString()</span>
</div>
<div class="todo-item-details"><p>@item.TodoContent</p>
</div>
@code
{public List<TodoItem> TodoItems { get; private set; }protected override async Task OnInitializedAsync(){TodoItems = await scheduler.GetAllTasks();await base.OnInitializedAsync();}
}

Event Binding

在现在的 Blazor 里,事件绑定是偏向于使用原生的事件名,比如按钮的事件通过 @onclick 方式来绑定事件,例如下面的示例:

<button @onclick="AddNewTodo" class="btn btn-info">Add new todo</button>

为 button 指定了一个 onclick 事件处理器

Call JS method

执行 JS 方法有时候是不可缺少的一部分,因为很多组件都是 JS 的,借助于此,我们就可以直接调用  JS 的方法来实现一些组件功能,示例如下,分是否有返回值可以分为两类:

With return value

@inject IJSRuntime JS
@code {private MarkupString text;private async Task ConvertArray(){text = new(await JS.InvokeAsync<string>("convertArray", quoteArray));}
}

Without return value

@inject IJSRuntime JS
@code {private Random r = new();private string stockSymbol;private decimal price;private async Task SetStock(){stockSymbol = $"{(char)('A' + r.Next(0, 26))}{(char)('A' + r.Next(0, 26))}";price = r.Next(1, 101);await JS.InvokeVoidAsync("displayTickerAlert1", stockSymbol, price);}
}

More

更多关于 Blazor 相关的知识可以参考微软的文档

References

  • https://docs.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-5.0

  • https://docs.microsoft.com/en-us/aspnet/core/blazor/hosting-models?view=aspnetcore-5.0

  • https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing?view=aspnetcore-5.0

  • https://docs.microsoft.com/en-us/aspnet/core/blazor/javascript-interoperability/call-javascript-from-dotnet?view=aspnetcore-5.0

  • https://docs.microsoft.com/en-us/aspnet/core/blazor/javascript-interoperability/call-dotnet-from-javascript?view=aspnetcore-5.0

  • https://docs.microsoft.com/en-us/dotnet/api/microsoft.jsinterop.ijsruntime?view=dotnet-plat-ext-6.0

Blazor 基础入门相关推荐

  1. .NET开发者的机遇与Web Blazor基础(有彩蛋)

    一.唠唠WebAssembly的发展历程 目前有很多支持WebAssembly的项目,但发展最快的是Blazor,这是一个构建单页面的.NET技术,目前已经从Preview版本升级到了beta版本,微 ...

  2. 用python循环语句求素数_Python基础入门_3条件语句和迭代循环

    Python 基础入门前两篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类型 这是第三篇内容,主要简单介绍条件语句和迭代循环语句,内容也比较简单,目录如下: 条 ...

  3. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

  4. Blender 3.0基础入门学习教程 Introduction to Blender 3.0

    成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...

  5. 三维地形制作软件 World Machine 基础入门学习教程

    <World Machine课程>涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形. 你会学到什么 为渲染或游戏开发创建高分辨率.高细节的地形. 基于Worl ...

  6. SketchUp Pro 2021基础入门学习视频教程

    SketchUp Pro 2021基础入门学习视频教程 1280X720 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 流派:电子学习|语言:英语+中文字幕( ...

  7. Maya基础入门学习教程

    Maya基础入门学习教程 视频:.MKV, 1280x720, 共57节课 时长 4小时25分钟,3GB 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 指导老师:Shane Whitt ...

  8. Maya2022基础入门学习教程

    Maya2022基础入门学习教程 Maya 2022 Essential Training Maya2022基础入门学习教程 Maya 2022 Essential Training MP4 |视频: ...

  9. Blender基础入门学习教程 Learning Blender from Scratch

    Blender基础入门学习教程 Learning Blender from Scratch 流派:电子学习| MP4 |视频:h264,1280×720 |音频:aac,48000 Hz 语言:英语+ ...

最新文章

  1. 函数嵌套 lisp表达式求值
  2. async/await的实质理解
  3. sql server模糊查询、分组
  4. server接收dtu透传代码_Swoole学习笔记二:初探server与client(Client同步)
  5. 光敏电阻控制led亮度程序_Arduino动手做(2)光敏电阻模块
  6. linux unzip命令
  7. win7语言文件夹c盘什么位置,Win7系统C盘中ProgramData文件夹在哪?
  8. java 文字水印 旋转_java实现倾斜水印铺满整张图
  9. Java锁原理与应用
  10. matlab 逐日 变逐月,100多年的逐日数据在EXCEL里用VBA程序求月平均和月求和 - 信息科学 - 小木虫 - 学术 科研 互动社区...
  11. python3字符串详解速查,新手流泪,老手顿悟
  12. Laravel Eloquent If Record Exists
  13. 老中医给程序员的养生指北|开奖啦
  14. Cadence之ORCAD:导出Bom清单
  15. 什么是REST ful?
  16. Petya勒索病毒(2016.4月样本)分析笔记
  17. 计算机技能大赛奖品,第一届全国技能大赛都有哪些奖励政策?
  18. 神武2手游服务器等级限制影响,《神武2》手游开放新等级!不再为修炼等级操心...
  19. JZOJ 4745. 看电影
  20. 145.如何评价个性化推荐系统的效果-2

热门文章

  1. dim private public static_PHP中const,static,public,private,protected的区别
  2. VMware——安装CentOS
  3. PHP中的include、include_once、require、require_once
  4. 如何让apache支持.htaccess 解决Internal Server Error The server …错误
  5. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(八)
  6. 【iCore3 双核心板】例程二十二:LAN_UDP实验——以太网数据传输
  7. Android 使用XmlPullParser解析xml
  8. Ext4.2文件目录及页面默认导入文件
  9. ajax跨域请求的问题
  10. C#——一个简单的文件管理器