Blazor 从入门到放弃

2023-05-16

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>
  • 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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Blazor 从入门到放弃 的相关文章

  • 如何在 Blazor 中实现拖放?

    我知道 Blazor 是一项新技术 当前版本为 v0 5 1 不过 我目前正在为一个新的 Web 应用程序实现 PoC 我们希望在应用程序中具有拖放功能 我尝试以 Blazor 方式实现它 但它不起作用 我的放置目标 div class c
  • 组件属性不支持复杂内容(混合 C# 和标记)

    我正在尝试使用 Razor 参数并将其传递到 Blazor 中进行进一步处理 但在我尝试构建的 onclick 事件上收到此错误消息 组件属性不支持复杂内容 混合 C 和标记 img 标签如下 tr for int j 0 j lt Can
  • 在 Docker 中运行 Blazor

    我使用 Visual Studio 2019 预览版 创建了第一个 Blazor 测试 回购协议是here https github com mitkins holly test 当我在 VS 中点击 IISExpress 按钮时 一切都按
  • Blazor 本地化

    我尝试在 Blazor 应用程序中实现本地化 但在尝试通过视图中的键获取资源值时遇到一些问题 我怎样才能做到这一点 到目前为止 这是我的代码 启动 cs public void ConfigureServices IServiceColle
  • 如何访问 Blazor 服务器客户端的当前线路

    我正在开发一个使用 ASP NET Core 的 Blazor Server 项目Identity 我正在尝试实现一个组件来管理当前的活动用户 我可以访问当前客户端的当前身份用户 但我似乎无法访问与当前客户端关联的电路 因为我想跟踪每个用户
  • 如何在 Blazor 中订阅 onscroll 事件?

    我试图对 Blazor 中的 onscroll 事件做出反应 以便在用户向下滚动网页时为图像设置动画 类似于此网站上的品牌徽标 https lebenswelten stgabriel at https lebenswelten stgab
  • 如何在自定义验证属性中获取/注入服务

    我们使用 NET Core 3 1 5 这是一个 Blazor 服务器应用程序 我们有一个 ValidationAttribute 并需要访问外部服务来验证对象 ValidationAttribute 有 IsValid 方法 protec
  • 如何访问 Blazor WebAssembly 中的应用程序设置

    我当前正在尝试将 api url 保存在应用程序设置中 但是 configuration Properties似乎是空的 我不确定如何获取该设置 在程序 cs中 public static async Task Main string ar
  • Blazor - Web 程序集加载时间

    我开发了 Blazor Server 服务器应用程序 客户显然不喜欢 无法重新连接到服务器 重新加载页面以恢复功能 的消息 这就是我尝试探索迁移到 Web Assembly 的原因 我正在努力 如何加快 Web 程序集加载时间 因为主页无法
  • Blazor 继承 ChildContent RenderFragments?

    假设我们有一个基本组件ParentComponent razor div ChildContent div code Parameter public RenderFragment ChildContent get set 可以这样使用
  • 在 Blazor 中增加文本区域

    我需要一个随着行数增加而增长的文本区域 一旦行被删除 TextArea 就会再次缩小 在最好的情况下具有最大高度 它如何与 Javascript 一起工作我已经可以在这里阅读 根据内容长度调整文本区域大小 https stackoverfl
  • Maui-blazor 渐变闪屏

    是否可以设置渐变启动画面 在例子中 https learn microsoft com en us dotnet maui user interface images splashscreen tabs android
  • Blazor - 如何动态创建组件

    我想测试是否可以动态创建 Blazor 组件 我找不到任何方法来做到这一点 我尝试了一些在上面找到的动态内容这个链接 https learn blazor com pages dynamic content 但最终还没有得到任何结果 根据对
  • 仅允许在 blazor 中上传特定文件类型

    我在用BlazorInputFile用于在 Blazor 中上传文件的包 Problem 这段代码不起作用
  • 使用 Blazor 和 C# 刷新 html 表数据

    我有一种情况 我有一个 for 循环 它从我的数据模型创建我的 html 表 该数据模型从 SQL Server Express 获取数据 我想知道是否可以创建一个自动刷新方法 其中表数据仅刷新而不刷新整个页面 如果没有 那么也许 OnCl
  • 有人可以解释 Blazor 组件标签的各种语法吗

    在我的 razor 文件中 我有这些标签 只是一个示例 它们有效 但我无法向自己解释各种语法背后的原因
  • 有没有办法在 Blazor 中隐藏 div?

    我正在使用 Blazor 并且想在按下导航栏切换器图标时隐藏侧边栏 列表项崩溃了 但问题是 div 仍然存在 div class page div class sidebar div class nav top row pl 4 navba
  • 共享类与 swagger 生成的类

    我有一个包含三个项目的 asp net Blazor VS 解决方案 Shared ASP NET核心API Blazor 网络组件 我创建了一堆课程Shared项目和其他两个项目 参考了Shared项目 到目前为止一切都很好 然后我用了S
  • 状态存储在 Fluxor 中的哪里?

    我是与状态管理人员合作的新手 目前 我正在开发 blazor 应用程序 我偶然发现了 fluxor 框架 它允许通过 Flux 模式进行状态管理 Fluxor 对我来说工作得很好 但是我似乎无法弄清楚页面状态的实际存储位置 它是在缓存 数据
  • Wasm DOM 访问和引用类型

    我一直非常密切地关注 WebAssembly 的路线图 特别是调用 JS 互操作的性能影响 作为本次活动的一部分参考类型提案 https github com WebAssembly reference types blob master

随机推荐