学习ASP.NET Core Blazor编程系列十——路由(中)
学习ASP.NET Core Blazor编程系列一——综述
五、通过路由传参
通过上面的示例,我们使用<a>标签实现了页面之间的跳转,但是通常我们开发的Web应用程序,通过http的url进行页面跳转时,会进行参数传递,以方便我们跳转到的新页面进行一些前置操作。下面我们示例来学习如何从“图书列表”页面,使用鼠标点击“编辑“按钮进行跳转时,传递一个参数(例如图书ID)给新的页面“AddBook”。我们在“图书列表”页面中的将图书ID这个参数,在进行页面跳转时同步传递给“AddBook”页面,并且通过这个ID,查询到相应的图书信息,显示在AddBook页面上。
六、 通过path传参
通过url传参一般有两种方式,一种是直接把参数组合在URL的路径(path)里。路由器使用路由参数以相同的名称填充相应的组件参数。 路由参数名不区分大小写。 在下面的示例中,对 /AddBook/3
发出请求,参数Id将URL路径中的参数值赋给AddBook组件的 Id属性。
1. 在Visual Studio 2022的解决方案资源管理器中,找到 BookIndex.razor
组件,使用鼠标左键双击,在文本编辑器中打开,然后修改代码如下:
- @page "/BookIndex"
- @using BlazorAppDemo.Models
- @using Microsoft.EntityFrameworkCore
- @inject IDbContextFactory<BookContext> dbFactory
- <PageTitle>图书列表</PageTitle>
- <h3>图书列表</h3>
- <table class="table-responsive" width="90%">
- <tr><td>Name</td>
- <td>Author</td>
- <td>Price</td>
- <td>ReleaseDate</td>
- <td>StockQty</td>
- <td>Qty</td>
- <td>操作</td>
- </tr>
- @foreach (var item in books)
- {
- <tr>
- <td>@item.Name</td>
- <td>@item.Author</td>
- <td>@item.Price</td>
- <td>@item.ReleaseDate</td>
- <td>@item.StockQty</td>
- <td>@item.Qty</td>
- <td><a href="/AddBook/@item.ID">编辑</a></td>
- </tr>
- }
- </table>
- @code {
- private static BookContext _context;
- private List<Book> books = new List<Book>();
- protected override async Task OnInitializedAsync()
- {
- _context = dbFactory.CreateDbContext();
- books=_context.Book.ToList();
- await base.OnInitializedAsync();
- }
- }
2. 在Visual Studio 2022的解决方案资源管理器中,找到 AddBook.razor
组件,使用鼠标左键双击,在文本编辑器中打开,AddBook.razor组件中添加一行@page开头的路由模板。本示例中
使用一个“/AddBook/{Id}” 路由模板来匹配Id,并且在代码中声明一个Id属性,并添加特性[Parameter]。修改代码如下:
- @page "/AddBook"
- @page "/AddBook/{Id}"
- @using BlazorAppDemo.Models
- @using Microsoft.EntityFrameworkCore
- @inject IDbContextFactory<BookContext> dbFactory
- <h3>AddBook</h3>
- <EditForm Model=@addBook OnValidSubmit=@ValidSubmitInfo OnInvalidSubmit=@InvalidSubmitInfo>
- <DataAnnotationsValidator />
- <ValidationSummary />
- <div>@Message</div>
- <p> 图书名称:
- <InputText @bind-Value=addBook.Name></InputText>
- <ValidationMessage For="@(() => addBook.Name)" />
- </p>
- <p>作者:
- <InputText @bind-Value=addBook.Author></InputText>
- <ValidationMessage For="@(() => addBook.Author)" />
- </p>
- <p>出版日期:
- <InputDate @bind-Value=addBook.ReleaseDate></InputDate>
- </p>
- <p>价格:
- <InputNumber @bind-Value=addBook.Price></InputNumber>
- </p>
- <p>类型:
- <InputText @bind-Value=addBook.Type></InputText>
- <ValidationMessage For="@(() => addBook.Type)" />
- </p>
- <p>总页数:
- <InputNumber @bind-Value=addBook.TotalPages></InputNumber>
- </p>
- <p>库存数量:
- <InputNumber @bind-Value=addBook.StockQty></InputNumber>
- <ValidationMessage For="@(() => addBook.StockQty)" />
- </p>
- <p>已租数量:
- <InputNumber @bind-Value=addBook.Qty></InputNumber>
- </p>
- <input type="submit" class="btn btn-primary" value="Save" />
- </EditForm>
- @code {
- private string Message = string.Empty;
- private static BookContext _context;
- private Models.Book addBook = new Book();
- protected override Task OnInitializedAsync()
- {
- _context = dbFactory.CreateDbContext();
- return base.OnInitializedAsync();
- }
- [Parameter]
- public string Id { get; set; }
- protected override void OnParametersSet()
- {
- Id = Id ?? "0";
- if (!string.IsNullOrEmpty(Id))
- {
- if (Id!="0")
- {
- int iId = int.Parse(Id);
- var book = _context.Book.Find(iId);
- if (book!=null)
- {
- addBook = book;
- }
- }
- }
- }
- private void ValidSubmitInfo(EditContext editContext)
- {
- if (editContext.Model is Book addBook)
- {
- Message = "你编辑的不是图书信息,校验通过。正在保存。";
- }
- }
- private void InvalidSubmitInfo(EditContext editContext)
- {
- if (editContext.Model is Book addBook)
- {
- Message = "你编辑的图书信息校验不通过,请修改。";
- }
- }
- private void Save(EditContext editContext)
- {
- bool dataIsValid = editContext.Validate();
- if (!dataIsValid)
- {
- Message = "你编辑的图书信息校验不通过,请修改。";
- return;
- }
- if (editContext.Model is not Book addBook)
- {
- Message = "你编辑的不是图书信息。";
- return;
- }
- _context.Add(editContext.Model);
- int cnt= _context.SaveChanges();
- if (cnt>0)
- {
- Message = "图书信息保存成功!";
- }else
- {
- Message = "图书信息保存失败!";
- }
- }
- }
3.在Visual Studio 2022的菜单栏上,找到“调试à开始调试”或是按F5键,Visual Studio 2022会生成BlazorAppDemo应用程序,并在浏览器中打开Home页面,我们我们使用鼠标左键点击左边菜单上的“图书列表”菜单项,浏览器会显示我们修改过的图书列表页面,将鼠标指针悬停在“编辑”链接上可以查看,链接背后的URL值,我们会在浏览器的左下角看到https://localhost:7110/AddBook/3这样的地址。如下图。
4.在浏览器中,使用鼠标左键点击我们要修改的图书信息的“编辑”按钮,浏览器会自动跳转到AddBook页面,并将我们需要修改的图书信息显示出来。如下图。
七、路由约束
路由约束强制在路由段和组件之间进行类型匹配。
在以下示例中,到AddBook组件的路由仅在以下情况下匹配:
- 请求 URL 中存在
Id
路由段。 Id
段是一个整数 (int
) 类型。
- Pages/AddBook.razor:
- @page "/AddBook/{Id:int}"
- <h1>Book Id: @Id</h1>
- @code {
- [Parameter]
- public int Id { get; set; }
- }
备注
路由约束不适用于查询字符串值。
下表中显示的路由约束可用。 有关与固定区域性匹配的路由约束,请参阅表下方的警告了解详细信息。
约束 |
示例 |
匹配项示例 |
固定条件区域性 匹配 |
|
|
|
否 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
否 |
|
|
|
是 |
|
|
|
是 |
警告
验证 URL 的路由约束并将转换为始终使用固定区域性的 CLR 类型(例如 int
或 DateTime)。 这些约束假定 URL 不可本地化。
学习ASP.NET Core Blazor编程系列十——路由(中)的更多相关文章
- 学习ASP.NET Core Blazor编程系列十——路由(上)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列八——数据校验
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Blazor编程系列九——服务器端校验
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- C#基础_C#判断文件是否被打开
1.用文件流判断 using System; using System.Collections.Generic; using System.IO; using System.Linq; using S ...
- 第五十四篇:网络通信Axios
好家伙,补充知识 1.什么是Axios? Axios可以在浏览器中发送 XMLHttpRequests Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get.post请 ...
- 【UML分析、建模与设计】我在工作时遇到UML
一.前言 UML分析.建模与设计 来自现实世界中的概念的抽象描述方法(摘取自<UML面向对象分析.建模与设计(第2版)>) 就我对UML分析与建模技术的认知,最早可追溯至2019年时的学习 ...
- ClangFormat配置备份
{ # 语言 Language: Cpp, # 水平对齐表达式的操作数 AlignOperands: true, # 不对包含头文件进行排序 SortIncludes: false, # 对齐注释 A ...
- C语言的几个入门关于函数调用练习
1.找素数(素数:除了1和本身之外不能被任何整数整除的的数)(被某数整除=除以某数是整数) 问题:输出2到200(包括2和200)的使有素数,从小到大排序. 思路:检查所有比i小的数,取余. 涉及的知 ...
- 微信小程序-前后端交互
前台手机验证码登录 <view>手机号:</view> <input value="{{phone}}" bindinput="bindPh ...
- day41-网络编程03
Java网络编程03 5.UDP网络通信编程[了解] 5.1基本介绍 类DatagramSocket 和 DatagramPacket[数据报/数据包]实现了基于 UDP的协议网络程序 UDP数据报通 ...
- 绕过CDN获取服务器真实IP地址
相关视频链接:(https://blog.sechelper.com/20220914/penetration-testing-guide/cdn-bypass) CDN(Content Delive ...
- 【学习笔记】前馈神经网络(ANN)
前言 最近跟着<神经网络与深度学习>把机器学习的内容简单回顾了一遍,并进行了一定的查缺补漏,比如SVM的一些理解,one-hot向量,softmax回归等等. 然后我将继续跟着这本书,开始 ...
- typora基础和计算机五大组成部分
typora typora软件 是一款适合于IT行业文本编辑器,笔记,当下来说,非常火爆,可以使用多种语言,python java... 安装的时候路径选择可以设置一些简单便于后续查找的文件路 ...