ASP.NET Core Blazor Webassembly 之 路由

简介:

ASP.NET Core Blazor Webassembly 之 路由

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

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

@page "/page/a"

 PAGE A

@code {

}

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

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

使用a标签进行页面跳转
a标签作为超链接是我们web开发最常用的跳转方式,blazor同样支持。
新建Page B

@page "/page/b"

 PAGE B

@code {

}

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

@page "/page/a"

 PAGE A


<a href="/page/b">Page B</a>

@code {

}

运行一下试试:

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

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

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

修改Page A:

@page "/page/a"

 PAGE A


<a href="/page/b/@userName">Page B</a>

@code {

private string userName = "小明";

}

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

修改Page B:

@page "/page/b/{userName}"

 PAGE B


userName: @userName

@code {

[Parameter]
public string userName { get; set; }

}

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

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

修改Page A:

@page "/page/a"

PAGE A


<a href="/page/b?username=@userName">Page B</a>

@code {

private string userName = "小明";

}

首先安装一个工具库:

Install-Package Microsoft.AspNetCore.WebUtilities -Version 2.2.0
修改Page B:

@page "/page/b"

PAGE B


userName: @UserName

@using Microsoft.AspNetCore.WebUtilities;

@inject NavigationManager NavigationManager;

@code {

[Parameter]
public string UserName { get; set; }
protected override void OnInitialized()
{
    var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
    QueryHelpers.ParseQuery(uri.Query).TryGetValue("username", out Microsoft.Extensions.Primitives.StringValues userName);
    Console.WriteLine(NavigationManager.Uri);
    UserName = userName.ToString();
    Console.WriteLine(UserName);

    base.OnInitialized();
}

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

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

比如导航到counter的NavLink:

            <span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>

最后翻译成html:

            <span class="oi oi-plus" aria-hidden="true"></span> Counter


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

@page "/page/a"

PAGE A



   go to B


@inject NavigationManager NavigationManager
@code {

private void GoToB()
{
    NavigationManager.NavigateTo("/page/b?username=小猫");
}

}

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

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

为了方便我们给NavigationManager直接写个扩展方法吧。
首先修改Program把IServiceCollection暴露出来:

public class Program
{
    public static IServiceCollection Services;

    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");

        builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
        Services = builder.Services;

        await builder.Build().RunAsync();
    }
}

扩展类:

public static class Ext

{
    public static void Back(this NavigationManager navigation)
    {
        var jsruntime = Program.Services.BuildServiceProvider().GetService<IJSRuntime>();
        jsruntime.InvokeVoidAsync("history.back");
    }
}

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

修改Page B:

@page "/page/b"

PAGE B


userName: @UserName


<button @onclick="GoBack">
    Go back
</button>

@using Microsoft.AspNetCore.WebUtilities;

@inject NavigationManager NavigationManager;

@code {

[Parameter]
public string UserName { get; set; }
protected override void OnInitialized()
{
    var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
    QueryHelpers.ParseQuery(uri.Query).TryGetValue("username", out Microsoft.Extensions.Primitives.StringValues userName);
    Console.WriteLine(NavigationManager.Uri);
    UserName = userName.ToString();
    Console.WriteLine(UserName);

    base.OnInitialized();
}

private void GoBack()
{
    NavigationManager.Back();
}

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

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

作者:Agile.Zhou(kklldog)
出处:http://www.cnblogs.com/kklldog/

相关文章
|
6天前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
6天前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
18 3
|
28天前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
2月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
35 0
|
28天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
28 7
|
26天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
38 0
|
2月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
36 0
|
2月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
2月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
91 0
|
5月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
158 0
下一篇
无影云桌面