web最精妙的设计就是通过url把多个页面串联起来,并且可以互相跳转。我们开发系统的时候总是需要使用路由来实现页面间的跳转。传统的web开发主要是使用a标签或者是服务端redirect来跳转。那今天来看看Blazor是如何进行路由的。

使用@page指定组件的路由path

我们可以在Blazor里给每个组件指定一个path,当路由匹配的时候会显示这个组件。

  1. @page "/page/a"
  2. <h2>
  3. PAGE A
  4. </h2>
  5. @code {
  6. }

访问/page/a 看到Page A页面被渲染出来了。

注意:如果是在浏览器里敲入url按回车切换页面,会发生一次http请求,然后重新渲染blazor应用。

使用a标签进行页面跳转

a标签作为超链接是我们web开发最常用的跳转方式,blazor同样支持。

新建Page B

  1. @page "/page/b"
  2. <h2>
  3. PAGE B
  4. </h2>
  5. @code {
  6. }

在Page A页面添加一个a标签进行跳转:

  1. @page "/page/a"
  2. <h2>
  3. PAGE A
  4. </h2>
  5. <p>
  6. <a href="/page/b">Page B</a>
  7. </p>
  8. @code {
  9. }

运行一下试试:

注意:使用a连接在页面间进行跳转不会发生http请求到后台,页面是直接在前端渲染出来的。

通过路由传参

通过http的url进行页面间传参是我们web开发的常规操作。下面我们演示下如何从Page A传递一个参数到Page B。我们预设Page A里面有个UserName需要传递到Page B,并且显示出来。

通过path传参

通过url传参一般有两种方式,一种是直接把参数组合在path里,比如“/page/b/小明”这样。

修改Page A:

  1. @page "/page/a"
  2. <h2>
  3. PAGE A
  4. </h2>
  5. <p>
  6. <a href="/page/b/@userName">Page B</a>
  7. </p>
  8. @code {
  9. private string userName = "小明";
  10. }

通过把userName组合到path上传递给Page B。

修改Page B:

  1. @page "/page/b/{userName}"
  2. <h2>
  3. PAGE B
  4. </h2>
  5. <p>
  6. userName: @userName
  7. </p>
  8. @code {
  9. [Parameter]
  10. public string userName { get; set; }
  11. }

Page B 使用一个“/page/b/{userName}” pattern来匹配userName,并且userName需要标记[Parameter]并且设置为public。

通过QueryString传参

除了把参数直接拼接在path里,我们还习惯通过QueryString方式传递,比如“/page/b?username=小明”。

修改Page A:

  1. @page "/page/a"
  2. <h2>
  3. PAGE A
  4. </h2>
  5. <p>
  6. <a href="/page/b?username=@userName">Page B</a>
  7. </p>
  8. @code {
  9. private string userName = "小明";
  10. }

首先安装一个工具库:

  1. Install-Package Microsoft.AspNetCore.WebUtilities -Version 2.2.0

修改Page B:

  1. @page "/page/b"
  2. <h2>
  3. PAGE B
  4. </h2>
  5. <p>
  6. userName: @UserName
  7. </p>
  8. @using Microsoft.AspNetCore.WebUtilities;
  9. @inject NavigationManager NavigationManager;
  10. @code {
  11. [Parameter]
  12. public string UserName { get; set; }
  13. protected override void OnInitialized()
  14. {
  15. var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
  16. QueryHelpers.ParseQuery(uri.Query).TryGetValue("username", out Microsoft.Extensions.Primitives.StringValues userName);
  17. Console.WriteLine(NavigationManager.Uri);
  18. UserName = userName.ToString();
  19. Console.WriteLine(UserName);
  20. base.OnInitialized();
  21. }
  22. }

页面获取QueryString的传参比较麻烦,Blazor并没有进行封装。所以我们需要通过QueryHelpers.ParseQuery方法手工把QueryString格式化成字典形式,然后获取对应的参数。QueryHelpers类存在Microsoft.AspNetCore.WebUtilities这个库里,需要通过nuget安装。

NavLink

NavLink是个导航组件,它其实就是封装了a标签。当选中的时候,也就是当前的url跟它的href一致的时候,会自动在class上加上active类,所以可以用来控制选中的样式。默认的3个导航菜单就是用的NavLink。

比如导航到counter的NavLink:

  1. <NavLink class="nav-link" href="counter">
  2. <span class="oi oi-plus" aria-hidden="true"></span> Counter
  3. </NavLink>

最后翻译成html:

  1. <a href="counter" class="nav-link active">
  2. <span class="oi oi-plus" aria-hidden="true"></span> Counter
  3. </a>

NavigationManager

有的时候我们可能需要在代码里进行导航,如果是JavaScript我们会用window.location来切换页面,Blazor为我们提供了相应的封装:NavigationManager。使用NavigationManager可以通过代码直接进行页面间的跳转。我们在Page A页面放个按钮然后通过按钮的点击事件进行跳转:

  1. @page "/page/a"
  2. <h2>
  3. PAGE A
  4. </h2>
  5. <p>
  6. <button @onclick="GoToB">
  7. go to B
  8. </button>
  9. </p>
  10. @inject NavigationManager NavigationManager
  11. @code {
  12. private void GoToB()
  13. {
  14. NavigationManager.NavigateTo("/page/b?username=小猫");
  15. }
  16. }

修改Page A的代码,注入NavigationManager对象,通过NavigationManager.NavigateTo方法进行跳转。

扩张Back方法

Blazor封装的NavigationManager咋一看以为跟WPF的NavigationService一样,我想当然的觉得里面肯定有个Back方法可以进行后退。但是查了一番发现还真的没有,这就比较尴尬了,没办法只能使用JavaScript来实现了。

为了方便我们给NavigationManager直接写个扩展方法吧。

首先修改Program把IServiceCollection暴露出来:

  1. public class Program
  2. {
  3. public static IServiceCollection Services;
  4. public static async Task Main(string[] args)
  5. {
  6. var builder = WebAssemblyHostBuilder.CreateDefault(args);
  7. builder.RootComponents.Add<App>("app");
  8. builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
  9. Services = builder.Services;
  10. await builder.Build().RunAsync();
  11. }
  12. }

扩展类:

  1. public static class Ext
  2. {
  3. public static void Back(this NavigationManager navigation)
  4. {
  5. var jsruntime = Program.Services.BuildServiceProvider().GetService<IJSRuntime>();
  6. jsruntime.InvokeVoidAsync("history.back");
  7. }
  8. }

这个扩展方法很简单,从DI容器里获取IJSRuntime的实例对象,通过它去调用JavaScript的history.back方法。

修改Page B:

  1. @page "/page/b"
  2. <h2>
  3. PAGE B
  4. </h2>
  5. <p>
  6. userName: @UserName
  7. </p>
  8. <p>
  9. <button @onclick="GoBack">
  10. Go back
  11. </button>
  12. </p>
  13. @using Microsoft.AspNetCore.WebUtilities;
  14. @inject NavigationManager NavigationManager;
  15. @code {
  16. [Parameter]
  17. public string UserName { get; set; }
  18. protected override void OnInitialized()
  19. {
  20. var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
  21. QueryHelpers.ParseQuery(uri.Query).TryGetValue("username", out Microsoft.Extensions.Primitives.StringValues userName);
  22. Console.WriteLine(NavigationManager.Uri);
  23. UserName = userName.ToString();
  24. Console.WriteLine(UserName);
  25. base.OnInitialized();
  26. }
  27. private void GoBack()
  28. {
  29. NavigationManager.Back();
  30. }
  31. }

在Page B页面上添加一个按钮,点击调用NavigationManager.Back方法就能回到上一页。

总结

到此Blazor路由的内容学习的差不多了,整体上没有什么特别的,就是NavigationManager只有前进方法没有后退是比较让我震惊的。

相关内容:

ASP.NET Core Blazor Webassembly 之 数据绑定

ASP.NET Core Blazor Webassembly 之 组件

ASP.NET Core Blazor 初探之 Blazor WebAssembly

ASP.NET Core Blazor 初探之 Blazor Server

ASP.NET Core Blazor Webassembly 之 路由的更多相关文章

  1. ASP.NET Core Blazor Webassembly 之 数据绑定

    上一次我们学习了Blazor组件相关的知识(Asp.net Core Blazor Webassembly - 组件).这次继续学习Blazor的数据绑定相关的知识.当代前端框架都离不开数据绑定技术. ...

  2. ASP.NET Core Blazor Webassembly 之 组件

    关于组件 现在前端几大轮子全面组件化.组件让我们可以对常用的功能进行封装,以便复用.组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件.它封装ht ...

  3. [Asp.Net Core] Blazor WebAssembly - 工程向 - 如何在欢迎页面里, 预先加载wasm所需的文件

    前言, Blazor Assembly 需要最少 1.9M 的下载量.  ( Blazor WebAssembly 船新项目下载量测试 , 仅供参考. ) 随着程序越来越复杂, 引用的东西越来越多,  ...

  4. ASP.NET Core Blazor WebAssembly 之 .NET JavaScript互调

    Blazor WebAssembly可以在浏览器上跑C#代码,但是很多时候显然还是需要跟JavaScript打交道.比如操作dom,当然跟angular.vue一样不提倡直接操作dom:比如浏览器的后 ...

  5. ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)

    Blazor支持渐进式应用开发也就是PWA.使用PWA模式可以使得web应用有原生应用般的体验. 什么是PWA PWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和 ...

  6. ASP.NET Core Blazor WebAssembly实现一个简单的TODO List

    基于blazor实现的一个简单的TODO List 最近看到一些大佬都开始关注blazor,我也想学习一下.做了一个小的demo,todolist,仅是一个小示例,参考此vue项目的实现http:// ...

  7. 学习ASP.NET Core Blazor编程系列十——路由(上)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  8. 学习ASP.NET Core Blazor编程系列十——路由(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  9. ASP.NET Core Blazor 用Inspinia静态页模板搭建简易后台(实现菜单选中)

    Blazor 是一个用于使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建丰富的交互式 UI. 共享使用 .NET 编写的服务器端和客户端应用逻辑 ...

随机推荐

  1. 基于Nettty打造自己的MVC服务器

    最近开始折腾Netty,体验下NIO编程.既然学习了,就要做点东西出来,要不然不容易掌握学到的东西.在Netty的官方demo上都有各种case的sample,打造Http服务器的核心代码就是从Sam ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场

    上一篇文章(https://www.cnblogs.com/meowv/p/12896898.html)已经成功将博客项目跑起来了,那么本篇主要是将之前遗留的问题解决,现在的代码看起来可能还是比较混乱 ...

  3. 浅谈产品模型(Profile)在程序设计中的作用

    引言:物联网平台的一个重要功能就是资产管理,产品或者设备都可以看成是资产中组成部分,所以有时候说物联网平台可以进行产品管理和设备管理.通常应用物联网平台开发一套具有产品或者设备管理功能的系统的时候,必 ...

  4. Python一切皆是对象,但这和内存管理有什么关系?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python的第15篇文章,我们来聊聊Python中内存管理机制,以及循环引用的问题. Python的内存管理机制 对于工程师而言,内 ...

  5. SWPU邮件登录界面的仿写(第二次作业)

    (一).检查并下载网页元素 在需仿写的页面按F12,点击element,寻找需要的图片元素. (二). 分析网页的布局 查看网页源代码. (三).开始仿写 由于我们的目标是仿写网页,所以可以直接复制网 ...

  6. 从零开始实现ASP.NET Core MVC的插件式开发(七) - 近期问题汇总及部分解决方案

    标题:从零开始实现ASP.NET Core MVC的插件式开发(七) - 问题汇总及部分解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/12 ...

  7. mysql 优化(包含sql语句的书写)

    http://blog.chinaunix.net/uid-11640640-id-3426908.html  mysql性能优化-慢查询分析.优化索引和配置 2012-11-30 15:18:42 ...

  8. Node.js NPM Tutorial

    Node.js NPM Tutorial – How to Get Started with NPM? NPM is the core of any application that is devel ...

  9. Maven系列(一) -- maven仓库的搭建

    从今天开始,我要写一个maven系列的文章,以帮助大家来更好的熟悉maven仓库,并且将自己优秀的的代码开源出去,一方面为开源做贡献,另一方面顺便提升自己的知名度,让我们把愉快的开始吧 为什么要搭建m ...

  10. 实验一:Linux系统与应用准备

    项目 内容 这个作业属于哪个课程 班级课程 这个作业的要求在哪里 作业要求 学号-学号 17043133-木腾飞 作业学习目标 (1)学习博客园软件开发者学习社区使用技巧和经验:(2)学习Markdo ...