Blazor_WASM之3:项目结构

简介: Blazor WebAssembly项目模板可选两种,Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty

Blazor_WASM之3:项目结构

Blazor WebAssembly项目模板可选两种,Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty

  • 如果使用Blazor WebAssemblyAPP模板,则应用将填充以下内容:
  • 一个 FetchData 组件的演示代码,该组件从静态资产 (weather.json) 加载数据,且用户与 Counter 组件交互。
  • Bootstrap前端工具包。
  • 如果使用 blazorwasm-empty 模板,则无需演示代码和 Bootstrap 即可创建应用。

项目结构

Pages目录

包含构成 Blazor 应用的可路由组件/页面 (.razor),每个页面的路由使用 @page指令指定,目录下的Index 组件 (Index.razor)为Home 页。

每个razor都会在后台编译成一个类,以自带的Counter.razor为例。

Counter.razor文件

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<prole="status">Current count: @currentCount</p>

<buttonclass="btn btn-primary"@onclick="IncrementCount">Click me</button>

@code {

   private int currentCount = 0;

   private void IncrementCount()

   {

       currentCount++;

   }

}

反编译后

[Route("/counter")]

publicclassCounter : ComponentBase

{

   privateintcurrentCount=0;

   protectedoverridevoidBuildRenderTree(RenderTreeBuilder__builder)

   {

       __builder.OpenComponent<PageTitle>(0);

       __builder.AddAttribute(1, "ChildContent", (RenderFragment)delegate(RenderTreeBuilder__builder2)

       {

           __builder2.AddContent(2, "Counter");

       });

       __builder.CloseComponent();

       __builder.AddMarkupContent(3, "\r\n\r\n");

       __builder.AddMarkupContent(4, "<h1>Counter</h1>\r\n\r\n");

       __builder.OpenElement(5, "p");

       __builder.AddAttribute(6, "role", "status");

       __builder.AddContent(7, "Current count: ");

       __builder.AddContent(8, currentCount);

       __builder.CloseElement();

       __builder.AddMarkupContent(9, "\r\n\r\n");

       __builder.OpenElement(10, "button");

       __builder.AddAttribute(11, "class", "btn btn-primary");

       __builder.AddAttribute(12, "onclick", EventCallback.Factory.Create<MouseEventArgs>((object)this, (Action)IncrementCount));

       __builder.AddContent(13, "Click me");

       __builder.CloseElement();

   }

   privatevoidIncrementCount()

   {

       currentCount++;

   }

}

通过对比,Razor组件会自动继承自ComponentBase,并且@code中的代码完全移入了编译后的类,而各种标签会在BuildRenderTree方法中用方法的形式进行输出。

PlaunchSettings.json

设置开发环境配置

Shared目录

  • MainLayout 组件 (MainLayout.razor):应用的布局组件。
  • MainLayout.razor.css:应用主布局的样式表。
  • NavMenu 组件 (NavMenu.razor):实现边栏导航。 包括 NavLink组件,该组件可向其他 Razor 组件呈现导航链接。
  • NavMenu.razor.css:应用导航菜单的样式表。
  • SurveyPrompt 组件 (SurveyPrompt.razor):Blazor 调查组件。

App.razor

应用的根组件,用于使用 Router 组件来设置客户端路由。app.razor中代码

<RouterAppAssembly="@typeof(App).Assembly">

   <FoundContext="routeData">

       <RouteViewRouteData="@routeData"DefaultLayout="@typeof(MainLayout)"/>

       <FocusOnNavigateRouteData="@routeData"Selector="h1"/>

   </Found>

   <NotFound>

       <PageTitle>Not found</PageTitle>

       <LayoutViewLayout="@typeof(MainLayout)">

           <prole="alert">Sorry, there's nothing at this address.</p>

       </LayoutView>

   </NotFound>

</Router>

如果发现有相应的组件则跳转过去,如果没有则会出现Sorry, there's nothing at this address.

wwwroot

应用的 Web 根目录文件夹,其中包含应用的公共静态资产,其中index.html 网页是实现为 HTML 页面的应用的根页面:

  • 最初请求的任何页面,都会呈现此页面。
  • 此页面指定 App 组件的呈现位置。 使用 appid (<div id="app">...</div>) 在 div DOM 元素的位置呈现组件。

index.html

<body>

   <divid="app">

       <!--等待进度框图片-->

       <svgclass="loading-progress">

           <circler="40%"cx="50%"cy="50%"/>

           <circler="40%"cx="50%"cy="50%"/>

       </svg>

       <divclass="loading-progress-text"></div>

   </div>

   <!--如果出现错误则会出现-->

   <divid="blazor-error-ui">

       An unhandled error has occurred.

       <ahref=""class="reload">Reload</a>

       <aclass="dismiss">🗙</a>

   </div>

   <scriptsrc="_framework/blazor.webassembly.js"></script>

</body>

_Imports.razor

包括要包含在应用组件 (.razor) 中的常见 Razor 指令,如 @using指令

Program.cs

应用入口点,.net 7使用了顶级语法

usingMicrosoft.AspNetCore.Components.Web;

usingMicrosoft.AspNetCore.Components.WebAssembly.Hosting;

varbuilder=WebAssemblyHostBuilder.CreateDefault(args);

builder.RootComponents.Add<App>("#app"); //将APP替换了index.html中id="app"的内容

builder.RootComponents.Add<HeadOutlet>("head::after");

//添加并配置了服务

builder.Services.AddScoped(sp=>newHttpClient { BaseAddress=newUri(builder.HostEnvironment.BaseAddress) });

awaitbuilder.Build().RunAsync();


相关文章
|
Java Spring
聊一下Spring Boot配置的加载顺序
聊一下Spring Boot配置的加载顺序
360 0
|
存储 Java 关系型数据库
图书管理系统【GUI/Swing+MySQL】(Java课设)
图书管理系统【GUI/Swing+MySQL】(Java课设)
227 0
|
存储 网络协议 Java
网络通信的核心机制:Socket如何实现高效数据传输(上)
网络通信的核心机制:Socket如何实现高效数据传输
|
4月前
|
Java 中间件 Nacos
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)
kratos-bootstrap 是 GoWind Admin 的核心引导框架,类比 Spring Boot,提供应用初始化、配置管理、组件集成等一站式解决方案。通过标准化流程与多源配置支持,开发者可快速构建企业级中后台服务,专注业务开发,降低微服务复杂度。
629 2
|
3月前
|
机器学习/深度学习 监控 算法
基于YOLOv8的工业织物瑕疵检测识别|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于YOLOv8构建工业织物瑕疵智能检测系统,精准识别洞、异物、油斑、织线错误四类缺陷,专为弱纹理高精细织物(如丝绸、粘胶)设计。含完整源码、标注数据集、预训练权重、PyQt5可视化界面及详细教程,支持图片/视频/摄像头实时检测,开箱即用,适用于质检、教学与科研。
353 14
|
4月前
|
数据采集 供应链 物联网
RFID智能灯条让快递驿站查找如此简单
相信很多取快递时都会遇到相同的问题,快递驿站的包裹物品众多,很难一下子找到自己的快递物件。如何快速高效地找到呢?以往都是通过取件码去一层一层的找到货架。目前,RFID技术的亮灯标签和包裹快递进行身份绑定,通过数据采集后进行开始查询,实现亮灯提示,从而快速的知道快递包裹在哪个位置,RFID智能灯条让快递驿站查找如此简单。
|
4月前
|
人工智能 监控 前端开发
年终汇报新思路:领导真正关心的四个关键层面
年终汇报不是罗列工作量,而是论证自身价值。关键在于展示如何解决真问题、体现思考深度、与团队战略对齐,以及能为明年贡献什么。测试开发人员应聚焦于如何通过技术手段化解风险、提升效率,并将一次性解决方案沉淀为团队能力。一份精炼、目标明确的汇报,远比冗长的任务清单更有力量。
|
4月前
|
监控 网络协议 Ubuntu
Debian网络延迟排查指南(从零开始诊断网络卡顿问题)
本文介绍如何在Debian系统中诊断网络延迟问题,涵盖ping、traceroute、mtr等工具的使用方法,帮助用户定位延迟根源,优化网络性能。适合Linux新手快速掌握网络诊断技巧。
|
5月前
|
JSON API 开发工具
快手平台根据关键词获取视频列表的 API 接口详解
本文介绍如何利用快手开放平台API,通过关键词搜索短视频。涵盖接口调用、参数配置、分页处理及响应解析,助开发者实现视频数据获取,适用于内容推荐、热点分析等场景,需注意权限、限流与数据合规。
1282 0
|
安全 Serverless API
多模态数据信息提取解决方案评测
该方案展示了如何利用阿里云的多模态大模型服务进行文本、图片和文档的信息提取。通过函数计算(FC)调用百炼模型服务API,实现信息提取功能。具体步骤包括: 1. **开通百炼模型服务**:获取API Key,确保可以调用大模型。 2. **部署应用**:使用函数计算部署应用模板,配置参数并创建环境。 3. **访问示例应用**:通过提供的域名访问示例网站,测试信息提取功能。 4. **清理资源**:删除函数计算和OSS Bucket等资源,避免产生额外费用。 此方案具备多模态推理、易于扩展、灵活调用模式和便捷安全的云产品接入等优点,适用于多种业务需求。
623 28