news 2026/8/25 20:17:20

ASP.NET Core Blazor简介和快速入门三(布局和路由)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ASP.NET Core Blazor简介和快速入门三(布局和路由)

、创建和应用Blazor 布局

网站应用往往有许多公共的视图部分,比如顶部导航nav,底部的footer,管理系统的左边的menu菜单等等。Layout可以轻松实现以上的效果。

Blazor 布局是一个 Razor 组件,它与引用该布局的组件共享标记。 布局可以使用数据绑定、依赖关系注入和组件的其他功能。

1、创建布局(可以理解为母版页)

新建一个razor文件,文件顶部使用@inherits LayoutComponentBase 表示继承自LayoutComponentBase ,说明这是个母版页,使@Body作为占位。

17db26a2fc59811f252472259a25564c

@inherits LayoutComponentBase

<PageTitle>Doctor Who® Database</PageTitle>

<header>

<h1>Doctor Who® Database</h1>

</header>

<nav>

<a href="main-list">Main Episode List</a>

<a href="search">Search</a>

<a href="new">Add Episode</a>

</nav>

@Body

<footer>

@TrademarkMessage

</footer>

@code {

public string TrademarkMessage { get; set; } ="CSharp精选营";

}

点击并拖拽以移动

2、MainLayout 组件

在从 Blazor 项目模板创建的应用中,MainLayout 组件就是应用的默认布局。

Blazor 的 CSS 隔离功能将独立 CSS 样式应用于 MainLayout 组件。 按照惯例,样式由相同名称的随附样式表 MainLayout.razor.css 提供。

4e72d0845945faae717cbd8bc4e4dc47

e2f8774f69788dd6c9469c6be0cee86a​

3、应用布局

在razor文件顶部申明“@layout 模板页名”来设置母版页,

bc1edcdda470ec5d61fc422465d5e24e

如果一个页面没有设置模板页,(就像blazor默认项目那样),他就会使用在app.razor文件中定义的默认模板页

07c69bc84df89396eb47a0f95384f6b9​

如何不设置任何模板页?

比如我们的登录的页面是不需要加通用模板的,通过@if 控制 RouteView的DefaultLayout即可

<Router AppAssembly="@typeof(App).Assembly">

<Found Context="routeData">

@if (routeData.PageType == typeof(Pages.LayoutSample))

{

<RouteView RouteData="@routeData" />

}

else

{

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

<FocusOnNavigate RouteData="@routeData" Selector="h1" />

}

</Found>

<NotFound>

<PageTitle>Not found</PageTitle>

<LayoutView Layout="@typeof(MainLayout)">

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

</LayoutView>

</NotFound>

</Router>

4、嵌套布局

组件可以引用一个布局,该布局又可以引用另一个布局。 例如,嵌套布局可用于创建多级菜单结构。

以下示例演示如何使用嵌套布局:

@inherits LayoutComponentBase

@layout ProductionsLayout

<PageTitle>Doctor Who® Database</PageTitle>

<header>

<h1>Doctor Who® Database</h1>

</header>

<nav>

<a href="main-episode-list">Main Episode List</a>

<a href="episode-search">Search</a>

<a href="new-episode">Add Episode</a>

</nav>

@Body

<footer>

@TrademarkMessage

</footer>

@code {

public string TrademarkMessage { get; set; } =

"CSharp精选营";

}

点击并拖拽以移动

ProductionsLayout 组件包含顶级布局元素,其中包含有标头 (<header>...</header>) 和页脚 (<footer>...</footer>) 元素。 带有DoctorWhoLayout组件的 Episodes 会在@Body出现的位置显示。

@inherits LayoutComponentBase

<header>

<h1>Productions</h1>

</header>

<nav>

<a href="main-production-list">Main Production List</a>

<a href="production-search">Search</a>

<a href="new-production">Add Production</a>

</nav>

@Body

<footer>

Footer of Productions Layout

</footer>

点击并拖拽以移动

以下呈现的 HTML 标记由前面的嵌套布局生成:

<header><h1>Productions</h1></header>

<nav><a href="main-production-list">Main Production List</a>

<a href="production-search">Search</a>

<a href="new-production">Add Production</a>

</nav>

<header><h1>Doctor Who® Database</h1></header>

<nav><a href="main-episode-list">Main Episode List</a>

<a href="episode-search">Search</a>

<a href="new-episode">Add Episode</a>

</nav>

<footer>CSharp精选营</footer>

<footer>

Footer of Productions Layout

</footer>

点击并拖拽以移动

更多参考:

https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/layouts?view=aspnetcore-9.0

二、路由配置和导航

ASP.NET Core Blazor 路由配置和导航 - 码农刚子 - 博客园

三、条件渲染和循环渲染

第一章中已经讲过了Blazor的语法。

1、Blazor 条件渲染

Blazor 中的 @if 语法用于根据条件动态渲染页面元素。它类似于 C# 的 if 语句,但专门用于处理 UI 渲染。请看以下示例:

@if (isLoading)

{

<p>加载中...</p>

}

else

{

<p>加载完成!</p>

}

@code {

private bool isLoading = true;

protected override void OnInitialized()

{

// 模拟加载完成

Task.Delay(2000).ContinueWith(_ =>

{

isLoading = false;

InvokeAsync(StateHasChanged);

});

}

}

点击并拖拽以移动

你可以嵌套多个 @if 或结合 else if 使用:

@if (userRole == "Admin")

{

<p>欢迎管理员!</p>

}

else if (userRole == "User")

{

<p>欢迎普通用户!</p>

}

else

{

<p>请登录。</p>

}

@code {

private string userRole = "Admin";

}

点击并拖拽以移动

2、Blazor 循环渲染

下面我们有一个list需要显示多个学生信息,@for,@do…while,@while 与foreach类似这里就不在赘述

<h3>用户列表</h3>

<table>

<thead>

<tr>

<th>Name</th>

<th>Age</th>

<th>Gender</th>

</tr>

</thead>

<tbody>

@foreach (var item in list)

{

<tr>

<td>@item.Name</td>

<td>@item.Age</td>

@switch (item.Gender)

{

case 0:

{

<td>男</td>

break;

}

case 1:

{

<td>女</td>

break;

}

case 2:

{

<td>未知</td>

break;

}

}

</tr>

}

</tbody>

</table>

@code {

List<User> list = new List<User>();

User User1 = new User()

{

Name = "John",

Age = 20,

Gender = 2,

};

User User2 = new User()

{

Name = "Sub",

Age = 22,

Gender = 0,

};

protected override void OnInitialized()

{

list.Add(User1);

list.Add(User2);

}

public class User

{

public string Name { get; set; } = string.Empty;

public int Age { get; set; }

public int Gender { get; set; } // 0: 男, 1: 女, 2: 未知

}

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 5:44:57

计算机Java毕设实战-基于springboot村委办公管理系统 基于SpringBoot的乡村事务综合服务平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/8/22 0:34:05

Java毕设选题推荐:基于springboot的村务管理系统的设计与实现智慧村务管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/8/25 19:03:06

老派C++程式設計師 vs. 現代C++程式設計師:類型系統觀念的全面戰爭

老派C程式設計師 vs. 現代C程式設計師&#xff1a;類型系統觀念的全面戰爭 引言&#xff1a;兩個時代的碰撞 在C的演進長河中&#xff0c;一場靜默卻深刻的革命正在類型系統的領域激烈展開。這不是一場公開宣戰&#xff0c;而是兩代程式設計師思維模式的根本對立——老派C程式…

作者头像 李华
网站建设 2026/8/22 8:55:02

2025年论文去AI率工具合集:每天5次免费AIGC查重+1500字免费降AI!

临近毕业&#xff0c;好多学弟学妹都在问&#xff1a;有没有免费的降AI率工具&#xff1f; 一篇论文动不动10000、20000字&#xff0c;查重、查AI率、降重、降AIGC率&#xff0c;再查一次AIGC率。从写好论文到最后通过查重&#xff0c;最起码得好几百。 对学生来说&#xff0…

作者头像 李华
网站建设 2026/8/25 16:18:36

MySQL 千万级表变更字段,要想不锁表,可以这么做!

01 故事背景 最近我们遇到了一个看似简单但背后很有坑的需求&#xff1a;在千万级订单表中新增一个业务字段。需求来自隔壁项目组&#xff0c;他们需要这个字段做一些统计分析。 从开发角度看&#xff0c;这事很常见&#xff0c;新增字段嘛&#xff0c;直接ALTER TABLE加一下…

作者头像 李华