学习.NET MAUI Blazor(四)、路由

news2024/11/24 13:21:14

Web应用程序的可以通过URL将多个页面串联起来,并且可以互相跳转。Web应用主要是使用a标签或者是服务端redirect来跳转。而现在流行的单页应用程序 (SPA) ,则通过路由(Router)来实现跳转,如Vue 、React等。

提示
MAUI的路由与Blazor路由有很大区别。

目录

  • MAUI Blazor的路由
  • 定义MAUI Blazor路由
    • 匹配到路由时
    • 未匹配到路由时
  • 路由跳转
  • 路由参数
    • path传参
    • QueryString 传参
  • 路由约束
  • 总结

MAUI Blazor的路由

在.NET MAUI Blazor应用中,路由是遵循Blazor的路由规则。也是通过路由组件(Router)实现的,打开Main.razor可以看到:

<Router AppAssembly="@typeof(Main).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
        <FocusOnNavigate RouteData="@routeData" Selector="h1" />
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p role="alert">Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>
<!--设置容器-->
<AntContainer />

Router 有两个子节点FoundNotFound

  • Found节点包含一个RouteView的定义,如果找到了路由定义就通过RouteView来呈现对应的页面,同时为所有页面指定默认的模板。
  • NotFound节点包含一个LayoutView的定义,如果没找到路由定义则呈现一个特定的页面,这里使用的默认模板是MainLayout,也可以自己实现一个。

定义MAUI Blazor路由

在MAUI Blazor中,路由的定义使用@page指令进行指定。在创建Blazor组件的时候,必须包含@page '路径"

MAUI路由与MAUI Blazor路由有很大区别
MAUI创建路由是根据Route属性或者通过 Routing.RegisterRoute显式的注册路由。
MAUI Blazor 则是在组件上,使用@page指令指定。

Visual Studio 2022编译器在编译带有 @page 指令的 Razor 组件 (.razor) 时,将为组件类提供一个 RouteAttribute 来指定组件的路由。

当应用程序启动时,应用程序将扫描由Router组件中AppAssembly属性指定的程序集,收集程序集中具有 RouteAttribute 的Blazor组件的路由信息。

在应用程序运行时,RouteView 组件:

  • 从 Router 接收 RouteData 以及所有路由参数。
  • 使用指定的组件的布局来呈现该组件,包括任何后续嵌套布局。

提示
Router 不与查询字符串值交互。

匹配到路由时

我们在上次代码的基础上,增加一个页面。在Pages目录下,新建一个Blazor组件:pdf.razor。创建完成后,默认代码是这样的:

<h3>pdf</h3>

@code {

}

我们使用@page指令指定路由为pdf。并写上几个大字。

@page "/PDF"

<Title Level="1">使用iTextSharp生成PDF文件</Title>

然后打开MainLayout.razor,给菜单增加一个MenuDataItem

new MenuDataItem
{
	Path = "/PDF",
	Name = "PDF",
	Key = "PDF",
	Icon = "file-pdf"
}

注意:
Blazor组件必须是大写字母开头,如果使用小写字母开头,编译的时候,会报一个错:
Component 'xxx' starts with a lowercase character. Component names cannot start with a lowercase character
xxx是组件的名字。

看下运行的效果:
在这里插入图片描述

未匹配到路由时

如果未匹配到路由,则会呈现上面的NotFound节点定义的内容。先把NotFound节点的内容稍微改造一下!

<NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <div style="text-align:center"><Icon Type="close-circle" Theme="twotone" TwotoneColor="#ff0000" Height="5em" Width="5em" /></div>
            <div style="margin-top:15px;text-align:center"><Title Level="3">页面走失!请确认输入的URL是否正确!</Title></div>
        </LayoutView>
    </NotFound>

MainLayout.razor中,增加一个MenuDataItem,指向一个不存在的页面:

new MenuDataItem
{
	Path = "/DataList",
	Name = "DataList",
	Key = "DataList",
	Icon = "appstore"
}

看下运行效果:
在这里插入图片描述

路由跳转

很多场景中,除了点击左侧的菜单跳转外,在页面中也需要进行跳转,Blazor支持的跳转除了HTML标记<a></a>外,还有个NavigationManager类。
NavigationManager类在Microsoft.AspNetCore.Components命名空间下。
改造下Index.razor

@page "/"
@inject NavigationManager navigationManager
<Title Level="1">Hello,DotNet宝藏库</Title>
<div style="margin-top:15px;"><Text Type="success">欢迎关注我的公众号!</Text></div>
<Divider />
<div style="margin-top:20px;"><a href="/Counter">使用a 标记跳转</a></div>
<div style="margin-top:20px;">
    <Button Danger Type="@ButtonType.Primary" OnClick="()=>DirectToCounter()">使用NavigationManager跳转</Button>
</div>
@code
{
    private void DirectToCounter()
    {
        navigationManager.NavigateTo("/Counter");
    }
}

这时,不论是点击链接还是点击按钮,都可以跳转到响应页面!
在这里插入图片描述

路由参数

路由的过程当中经常需要进行参数传递,以方便我们跳转到的新页面后进行一些操作。
Blazor传参分为两种情况:path传参以及QueryString传参。我们分别介绍下这两种传参的方法。

path传参

path传参就是把参数组合在URL路径里,接收参数的页面需要在@page以相同的名称填充参数。并添加Parameter特性对参数进行修饰。
先改造下Counter.razor

@page "/counter"
@page "/counter/{initNum}"

<Title Level="2">Counter</Title>
<Divider />
<p role="status">Current count: @currentCount</p>

<Button @onclick="IncrementCount" Type="primary">AntDesign 按钮</Button>
@code {
    [Parameter]
    public string initNum{ get; set; }

    private int currentCount = 0;
    
    protected override void OnParametersSet()
    {
        if (!int.TryParse(initNum, out int num))
        {
            currentCount = 0;
        }else
        {
            currentCount = num;
        }
    }
    private void IncrementCount()
    {
        currentCount++;
    }
    
}


代码中,增加了一个@page "/counter/{initNum}"{initNum}就是参数。

注意参数是不区分大小写的,但是为了更规范,建议URL全部用小写,c#代码则使用驼峰式命名。
还有Blazor并不支持可选参数,所以如果这个例子里面的initNum是可有可无的,则需要使用@page指令来定义两条路由,一条包含initNum,另一条不包含。
OnParametersSetOnParametersSetAsync中,我们把initNum赋值给currentCount
修改下Index.razor中的DirectToCounter方法:

 private void DirectToCounter()
    {
        navigationManager.NavigateTo("/Counter/10");
    }

运行起来,当点击使用NavigationManager跳转按钮后,Counter.razor中的currentCount为10。
在这里插入图片描述

QueryString 传参

除了把参数直接拼接在URL路径(path)里,另一种常用的传递参数的方法是,将参数做为QueryString传递给跳转页面,比如“/Counter?initNum=3”。我们可从 NavigationManager.Uri 属性中获取请求的查询字符串。
Index.razor里的
<a href="/Counter">使用a 标记跳转</a>改为<a href="/Counter?initNum=5">使用a 标记跳转</a>

修改Counter.razor,先引入NavigationManager

@page "/counter"
@inject NavigationManager navigationManager

OnParametersSet内获取参数

	protected override void OnParametersSet()
    {
        //if (!int.TryParse(initNum, out int num))
        //{
        //    currentCount = 0;
        //}else
        //{
        //    currentCount = num;
        //}
        var query = new Uri(navigationManager.Uri).Query;
        Console.WriteLine(query);
    }

断点后,可以看到,从Index.razor点击链接跳转到Counter.razor后,获取到了参数:
在这里插入图片描述
这里有个问题,获取到的参数不是键值对,而是一串字符串。与我们的期望不同。不过还好,我们可以通过QueryHelpers.ParseQuery来获取到键值对信息。
1、添加依赖:

PM> NuGet\Install-Package Microsoft.AspNetCore.WebUtilities -Version 2.2.0

2、解析参数

var queryDic = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);

在这里插入图片描述
可以获取到参数值了。把代码补充完整:

protected override void OnParametersSet()
    {
        //if (!int.TryParse(initNum, out int num))
        //{
        //    currentCount = 0;
        //}else
        //{
        //    currentCount = num;
        //}
        var query = new Uri(navigationManager.Uri).Query;
        var queryDic = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
        if (queryDic.ContainsKey("initNum"))
        {
            var count_str = queryDic["initNum"].ToString() ?? "";
            if (!int.TryParse(count_str, out int num))
            {
                currentCount = 0;
            }
            else
            {
                currentCount = num;
            }
        }
        else
        {
            currentCount = 0;
        }
        
    }

运行一下看看效果

在这里插入图片描述

路由约束

路由约束强制在路由段和组件之间进行类型匹配。像刚才例子中的initNum,我们可以写成@page "/counter/{initNum:int}",路由约束不适用于查询字符串,也就是QueryString传递的参数。Blazor支持以下几种约束类型:

  • bool
  • datetime
  • decimal
  • double
  • float
  • guid
  • int
  • long

总结

暂无,下次再会!

点击下方公众号卡片,关注我!一起学习,一起进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#一个网络小程序的逐步实现过程

经常要检测某些IP地址范围段的计算机是否在线。 有很多的方法&#xff0c;比如进入到网关的交换机上去查询、使用现成的工具或者编写一个简单的DOS脚本等等&#xff0c;这些都比较容易实现。 现在使用C#来完成。 1、简单上手 公用函数&#xff1a; public static long IPToLong…

传奇服务器容易受到什么攻击,怎么防御攻击?

有兄弟问明杰&#xff0c;说自己打算开服&#xff0c;听说攻击挺多的&#xff0c;就是想先了解一下开传奇用的服务器最容易受到什么类型的攻击&#xff0c;如果遇到了又改怎么防御呢&#xff1f;带着这个问题&#xff0c;明杰跟大家详细的说一下&#xff0c;常见的开区时候遇到…

Max Sum Plus Plus(DP 滚动数组优化)[HDU - 1024]

题目如下&#xff1a; 题目链接 Max Sum Plus Plus 题解 or 思路&#xff1a; 经典的动态规划问题 dp[i][j]dp[i][j]dp[i][j], 前 jjj 个物品&#xff0c; 我们分成题目要求的 iii 组 对于第 jjj 个物品&#xff0c; 我们可以将它分到 第 kkk 组中&#xff0c; 或者分到新的一…

前端八股文——笔试题

目录 前言 一、flex布局手写题目 二、移动端点击事件为什么有延迟&#xff1f;时间多久&#xff1f;如何解决这个问题&#xff1f; 1.meta标签里面content属性&#xff0c;设置禁止缩放。 2.设置默认宽度为浏览器宽度。 3.设置touch-action&#xff1a;manipulation。 4…

Chat-GPT从注册到搬进服务器

首先&#xff0c;我们要明白的一个事实是&#xff0c;不可能免费的成功搞定&#xff0c;得付出10几块得成本&#xff0c;我这个方法满打满算16块钱&#xff08;是不犯错得情况下&#xff0c;实际上我用了30多了&#xff09; 1.10元买个香港的服务器 不一定是香港的&#xff0c…

Day 04-Composition API_ref reactive 函数

1.ref函数 作用: 定义一个响应式的数据&#xff1b; 语法: const xxx ref(initValue) 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff0c;简称ref对象&#xff09;。 JS中操作数据&#xff1a; xxx.value 模板中读取数据: 不需要.value&#xff0c;直…

永恒之蓝(MS17-010)

目录追溯了解网络IP查找环境条件复现流程445端口使用MSF的永恒之蓝漏洞模块扫描模块攻击模块温馨提醒&#xff1a;纯水文&#xff0c;如果不幸翻到这篇文章&#xff0c;可以立刻关闭&#xff01; 先整理两个学习的链接&#xff08;本文学习第一个&#xff09;&#xff1a; htt…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK17特性讲解】

JDK各个版本特性讲解-JDK17特性 一、JAVA17概述 JDK 16 刚发布半年&#xff08;2021/03/16&#xff09;&#xff0c;JDK 17 又如期而至&#xff08;2021/09/14&#xff09;&#xff0c;这个时间点特殊&#xff0c;蹭苹果发布会的热度&#xff1f;记得当年 JDK 15 的发布也是同天…

Kafka Consumer auto.offset.reset 理解

先来一下 kafka 官网对于 auto.offset.reset 的解释&#xff1a; 上面的描述挺准确的&#xff0c;但如果没有相关背景会感觉很懵逼。网上也有很多文章讲这个东西并给了很多例子&#xff0c;看了之后总感觉没有理解清楚。 先来看一下怎么查看消费者 group 的 offset 情况&…

wpf需求及实现方法 动态创建控件 对数据模板任意对象操作 查找由 DataTemplate 生成的元素 查找由 ControlTemplate 生成的元素

我想实现一个支持多设备同时更新固件的应用。如下图 插入多少个设备就显示多少个进度度。每个进度条上显示对应的串口及进度。 最终实现演示如下&#xff1a; public MainWindow(){InitializeComponent();List<DownloadProgress> test new List<DownloadProgress>…

文件系统与文件系统管理以及RAID技术的思想

文件与文件系统FCB&#xff08;文件控制块&#xff09;文件是什么&#xff1f;文件是对 磁盘的抽象所谓文件 是指 一组带标识&#xff08;标识即为文件名&#xff09;的、在逻辑上有完整意义的信息项的序列。信息项&#xff1a;构成文件内容的基本单位&#xff08;单个…

AUTOSAR开发

综述 本文档主要描述了VP项目MCU芯片TC297的AUTOSAR方案。MCU的基础软件由AUTOSAR软件实现&#xff0c;AUTOSAR可简易理解为如下层次。 MCU芯片驱动层&#xff1a;MCU芯片的抽象层&#xff0c;目的是将各类MCU芯片进行抽象&#xff0c;向上统一接口&#xff0c;隔离其他层次软件…

自动控制原理笔记-改善性能的措施-高阶系统动态性能

目录 改善性能的措施&#xff1a; 两种改善二阶系统动态性能的措施&#xff1a; &#xff08;1&#xff09;测速反馈——增加阻尼 &#xff08;2&#xff09;比例微分——提前控制 改善系统性能方法对比&#xff1a;​ 两种改善性能方法的对比&#xff1a; 高阶系统动态性…

vscode插件开发入门案例-一键删除js文件中的某个函数

vscode插件开发入门案例-一键删除js文件中的某个函数vscode插件开发入门案例-一键删除js文件中的某个函数demo介绍准备工作插件开发package.json介绍extension.ts调试插件插件打包插件安装插件发布vscode应用市场vscode插件开发入门案例-一键删除js文件中的某个函数 代码仓库地…

数据分析之excel和finebi报表可视化对比

当我们拿到数据&#xff0c;想对数据实现可视化报表设计。第一步就是要了解什么是数据可视化分析&#xff0c;且数据可视化分析的方法有什么&#xff1f;而且当我们拿到excel表格的数据&#xff0c;第一个想法是excel表格自身实现报表数据可视化&#xff0c;除了用excel本身实现…

微信小程序 | 小程序组件化开发

&#x1f5a5;️ 微信小程序 专栏&#xff1a;小程序组件化开发 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f44…

梦想绽放CEO熊文:停产单一VR产品,VST将成为VR行业标配

很久没在北京参加线下活动了&#xff0c;真不容易。今天奇遇VR正式发布了消费级双目全彩VST VR设备&#xff1a;奇遇Dream MIX。会后&#xff0c;我还参加了梦想绽放CEO熊文的群访&#xff0c;从中了解到更多消息。 奇遇Dream MIX 关于奇遇Dream MIX这款产品&#xff0c;我开始…

【苹果iMessage相册推信息推】那些新功效理当可以或许压倒您。保护用户隐私是苹果的起点之一

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

如何从小白起步成为百万博主|配音运营工具必不可少

从新手做短视频&#xff0c;无论你是抖音还是快手&#xff0c;掌握一些视频运营工具&#xff0c;能让我们日常工作事半功倍以下是我做短视频三年来&#xff0c;一直都在使用的工具&#xff0c;从视频素材剪辑软件音效配音&#xff0c;满足了我日常运营的需求&#xff0c;新手也…

Windows Defense Mechanism - Part 1

Overview If I’m a long-time CTF player (or HackTheBox lab machine player), things are gonna go a little off when I’m put into a real world scenario - meaning that, when facing a well defended Windows machine. This article will summarize the main Window…