🧭 系列导航

📖 阅读说明

此部分内容旨在说明各种Blazor的基本概念与使用方法,并没有提供实际的教程式代码,所以读者没必要把代码敲一遍。没得意义。

🔧 Razor 组件 

Razor组件是Blazor应用的基本单元,每一个页面或页面上的元素都可以是一个组件,或者说,可以将组件看成是一个页面或引用到一个页面的一部分。

Razor组件分成三个部分组成,

1)声明:@page  "路由名称" ,用于表示当前页面的路由;@layout 模板名称,表示当前组件使用哪个布局模板;@inherits LayoutComponentBase,表示当前组件是一个布局组件等。

2)页面:使用HTML语言进行描述,中间穿插一些Razor的模板语法,用来表示组件应该长什么样,都有什么元素。

3)逻辑:@code { ... } ,描述组件的交互逻辑,比如某个按钮的单击事件、页面数据的延迟加载、组件参数/属性等。

示例代码:

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

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

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

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
View Code

🗺️ Blazor 基础路由

Blazor 通过路由组件<Router>将来自用户的请求路由到 Razor 组件。 <Router>组件在Blazor应用中的App组件内使用,默认会使用<Found>来描述可以找到路由信息时,如何进行处理,使用<NotFound>来描述找不到路由信息时,如何处理。

Blazor 路由用来将创建好的Razor组件与具体的URL绑定在一起。(这里与其他框架不同,路由的定义不是在一个单独的文件里面,而是在每个组件的声明部分,使用 @page "路由名称" 表示。

编译带有 @page 指令的 Razor 组件 (.razor) 时,将为生成的组件类提供一个 RouteAttribute 来指定组件的路由模板。

当应用启动时,将扫描指定为 路由器的 AppAssembly 的程序集,来收集具有 RouteAttribute 的应用组件的路由信息。

—— 《ASP.NET Core Blazor 路由和导航》

默认的 App 组件

 1 <Router AppAssembly="@typeof(App).Assembly">
 2     <Found Context="routeData">
 3         <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
 4         <FocusOnNavigate RouteData="@routeData" Selector="h1" />
 5     </Found>
 6     <NotFound>
 7         <PageTitle>Not found</PageTitle>
 8         <LayoutView Layout="@typeof(MainLayout)">
 9             <p role="alert">Sorry, there's nothing at this address.</p>
10         </LayoutView>
11     </NotFound>
12 </Router>
View Code

 

👗 Blazor 基础布局

与其他框架类似,Blazor可以将页面中的通用部分抽象成模板,然后放入到布局组件中。

在布局组件的声明部分,使用 @inherits LayoutComponentBase 表示当前组件是一个布局组件,然后就可以在其他的组件中使用  @layout 组件名称 来进行引用。

在布局组件的元素部分,可以编写使用此布局的组件的通用描述,比如左侧导航、底部说明等内容。然后使用 @body 表示引用此布局组件的页面组件的内容。

默认的 MainLayout.razor 组件

 1 @inherits LayoutComponentBase
 2 
 3 <div class="page">
 4     <div class="sidebar">
 5         <NavMenu />
 6     </div>
 7 
 8     <main>
 9         <div class="top-row px-4">
10             <a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
11         </div>
12 
13         <div class="content px-4">
14             @Body
15         </div>
16     </main>
17 </div>
View Code

 

带有导航组件引用的 MainLayout.razor 组件

 1 @inherits LayoutComponentBase
 2 
 3 <PageTitle>BlazorServerSample</PageTitle>
 4 
 5 <div class="page">
 6     <div class="sidebar">
 7         <NavMenu />
 8     </div>
 9 
10     <main>
11         <div class="top-row px-4">
12             <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
13         </div>
14 
15         <article class="content px-4">
16             @Body
17         </article>
18     </main>
19 </div>
View Code

 

导航组件

 1 <div class="top-row ps-3 navbar navbar-dark">
 2     <div class="container-fluid">
 3         <a class="navbar-brand" href="">BlazorServerSample</a>
 4         <button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
 5             <span class="navbar-toggler-icon"></span>
 6         </button>
 7     </div>
 8 </div>
 9 
10 <div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
11     <nav class="flex-column">
12         <div class="nav-item px-3">
13             <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
14                 <span class="oi oi-home" aria-hidden="true"></span> Home
15             </NavLink>
16         </div>
17         <div class="nav-item px-3">
18             <NavLink class="nav-link" href="counter">
19                 <span class="oi oi-plus" aria-hidden="true"></span> Counter
20             </NavLink>
21         </div>
22         <div class="nav-item px-3">
23             <NavLink class="nav-link" href="fetchdata">
24                 <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
25             </NavLink>
26         </div>
27     </nav>
28 </div>
29 
30 @code {
31     private bool collapseNavMenu = true;
32 
33     private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
34 
35     private void ToggleNavMenu()
36     {
37         collapseNavMenu = !collapseNavMenu;
38     }
39 }
View Code

 

布局组件可以嵌套多层使用,还可以通过在文件夹内创建 _Imports.razor 组件来描述(@layout 组件名称)当前文件夹中所有的组件的默认布局文件。

 

 

 

如果想要更改MainLayout.razor的位置(比如将其移动到我们自定义的专门用于放各种通用布局和模板文件的Shared文件夹中),需要更改项目根目录下的 _Imports.razor 文件,在其中加上对新建文件夹的应用。

 

 

 

🤔 总结思考

  • Blazor Server 与Blazor WebAssembly 在路由和导航上的一些用法是不同的,所以当需要使用Blazor WebAssembly时,可能需要重新学习相关部分内容;
  • Blazor的布局直观感受并不是特别的灵活,或许因为时间太短没有学习或领会到更加其灵活的地方;
  • 因为 _Imports.razor 组件的存在,直观上考虑,利用文件夹将具有相关性的组件组织起来比较好,这样或许会大量减少对于布局组件的引用。

 

posted @ 2022-12-26 15:55 Margin22 阅读(395) 评论(0) 推荐(0) 编辑
摘要: 最近手痒,正好阳性在家,就打算把代码再捡起来看看,学习下这些年来都有什么新东西出现。就看到了微软出的.Net 7 Blazor相关的内容。 走了一遍微软官方的教程,发现用处不大,(可能是年纪已高,也可能是断代太久),所以给这段时间立个小目标,从头开始学习一下这个Blazor。 有关Blazor Se 阅读全文
posted @ 2022-12-26 13:32 Margin22 阅读(577) 评论(0) 推荐(0) 编辑
摘要: 源码: 提示: no applicable method for 'xml_find_all' applied to an object of class "xml_document" 原因: 所要爬取的这个页面,将爬虫相关的方法禁用了。所以爬下来的是一个空的“xml_document”文档,无法进 阅读全文
posted @ 2018-11-01 10:08 Margin22 阅读(1691) 评论(0) 推荐(0) 编辑
摘要: 如果是使用的用户控件,可能会出现这个问题,经过尝试,重新生成解决方案一般可以解决这个问题。 阅读全文
posted @ 2011-12-01 10:51 Margin22 阅读(869) 评论(0) 推荐(0) 编辑
摘要: 【翻译】NHibernate 3.0 CookBook (一)模块与映射 阅读全文
posted @ 2011-11-07 13:16 Margin22 阅读(415) 评论(0) 推荐(0) 编辑
摘要: NHibernate相关问题整理。 阅读全文
posted @ 2011-11-04 18:26 Margin22 阅读(217) 评论(0) 推荐(0) 编辑
摘要: C# SourceCode ExampleC# 源码案例This Example shows the basic things when working with SQLite.NET.这个例子显示了使用SQLite.NET时的基本的事情。Basically this is how all ADO.NET Data Providers work ;D基本上,这是ADO.NET Data Providers 怎样工作的。Before you can use Finisar's SQLite.NET Data Provider, you have to tell your IDE abou 阅读全文
posted @ 2011-10-26 13:52 Margin22 阅读(690) 评论(0) 推荐(0) 编辑
摘要: 源:http://baike.baidu.com/view/850.htm 当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码。该状态代码记录在 IIS 日志中,同时也可能在 Web 浏览器或 FTP 客户端显示。状态代码可以指明具体请求是否已成功,还可以揭示... 阅读全文
posted @ 2011-10-24 10:38 Margin22 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 今天在学习WCF的时候,看到了这个没有接触过的类,于是就在MSDN上面学习了一下。下面是相关的总结。 MSDN参考: OperationContext GetCallbackChannel(Of T) Current 作用:提供对服务方法的执行上下文的访问权限。使用服务操作中的 OperationContext 访问当前操作执行环境。 特别是,操作上下文用于访问双工服务中的回调通道... 阅读全文
posted @ 2011-10-19 11:59 Margin22 阅读(2672) 评论(0) 推荐(2) 编辑
摘要: 实例化模版对象的两种方式: 1. 模板名称 对象名称 = new 模板名称(); 2. 使用ReportDocument ReportDocument report = new ReportDocument(); string reportPath = Server.MapPath("UserInfoForm.rpt"); report.Load(reportPath... 阅读全文
posted @ 2011-10-14 10:27 Margin22 阅读(237) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示