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

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

 学习ASP.NET Core Blazor编程系列一——综述
学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)
学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)学习ASP.NET Core Blazor编程系列三——实体学习ASP.NET Core Blazor编程系列四——迁移学习ASP.NET Core Blazor编程系列五——列表页面学习ASP.NET Core Blazor编程系列七——新增图书学习ASP.NET Core Blazor编程系列八——数据校验学习ASP.NET Core Blazor编程系列九——服务器端校验学习ASP.NET Core Blazor编程系列十——路由(上) 五、通过路由传参

          通过上面的示例,我们使用标签实现了页面之间的跳转,但是通常我们开发的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 组件,使用鼠标左键双击,在文本编辑器中打开,然后修改代码如下:
  1. @page "/BookIndex"
  2. @using BlazorAppDemo.Models
  3. @using Microsoft.EntityFrameworkCore
  4. @inject IDbContextFactory<BookContext> dbFactory
  5. <PageTitle>图书列表</PageTitle>
  6. <h3>图书列表</h3>
  7. <table class="table-responsive" width="90%">
  8.     <tr><td>Name</td>
  9.     <td>Author</td>
  10.     <td>Price</td>
  11.     <td>ReleaseDate</td>
  12.     <td>StockQty</td>
  13.     <td>Qty</td>
  14.     <td>操作</td>
  15.     </tr>
  16.     @foreach (var item in books)
  17.     {
  18.         <tr>
  19.         <td>@item.Name</td>
  20.         <td>@item.Author</td>
  21.         <td>@item.Price</td>
  22.         <td>@item.ReleaseDate</td>
  23.         <td>@item.StockQty</td>
  24.         <td>@item.Qty</td>
  25.             <td><a target="_blank" href="https://www.cnblogs.com/AddBook/@item.ID">编辑</a></td>
  26.     </tr>
  27.     }
  28. </table>
  29. @code {
  30.     private   static BookContext _context;
  31.     private List<Book> books = new List<Book>();
  32.     protected override async Task OnInitializedAsync()
  33.     {
  34.         _context = dbFactory.CreateDbContext();
  35.         books=_context.Book.ToList();
  36.         await base.OnInitializedAsync();
  37.     }
  38. }
复制代码
      上面代码中,标签的代码是通过把Id组合到URL的路径(path)上,将图书的ID传递给AddBook页面。      2. 在Visual Studio 2022的解决方案资源管理器中,找到 AddBook.razor 组件,使用鼠标左键双击,在文本编辑器中打开,AddBook.razor组件中添加一行@page开头的路由模板。本示例中使用一个“/AddBook/{Id}” 路由模板来匹配Id,并且在代码中声明一个Id属性,并添加特性[Parameter]。修改代码如下:
  1. @page "/AddBook"
  2. @page "/AddBook/{Id}"
  3. @using BlazorAppDemo.Models
  4. @using Microsoft.EntityFrameworkCore
  5. @inject IDbContextFactory<BookContext> dbFactory
  6. <h3>AddBook</h3>
  7. <EditForm Model=@addBook OnValidSubmit=@ValidSubmitInfo  OnInvalidSubmit=@InvalidSubmitInfo>
  8.     <DataAnnotationsValidator />
  9.     <ValidationSummary />
  10.     @Message
  11.     <p> 图书名称:
  12.     <InputText @bind-Value=addBook.Name></InputText>
  13.         <ValidationMessage For="@(() => addBook.Name)" />
  14.     </p>
  15.     <p>作者:
  16.     <InputText @bind-Value=addBook.Author></InputText>
  17.         <ValidationMessage For="@(() => addBook.Author)" />
  18.     </p>
  19.    
  20.     <p>出版日期:
  21.     <InputDate @bind-Value=addBook.ReleaseDate></InputDate>
  22.      </p>
  23.     <p>价格:
  24.     <InputNumber @bind-Value=addBook.Price></InputNumber>
  25.      </p>
  26.     <p>类型:
  27.      <InputText @bind-Value=addBook.Type></InputText>
  28.         <ValidationMessage For="@(() => addBook.Type)" />
  29.       </p>
  30.     <p>总页数:
  31.     <InputNumber @bind-Value=addBook.TotalPages></InputNumber>
  32.      </p>
  33.     <p>库存数量:
  34.     <InputNumber @bind-Value=addBook.StockQty></InputNumber>
  35.         <ValidationMessage For="@(() => addBook.StockQty)" />
  36.      </p>
  37.     <p>已租数量:
  38.     <InputNumber @bind-Value=addBook.Qty></InputNumber>
  39.     </p>
  40.     <input type="submit" class="btn btn-primary" value="Save" />
  41. </EditForm>
  42. @code {
  43.     private string Message = string.Empty;
  44.     private static BookContext _context;
  45.     private Models.Book addBook = new Book();
  46.     protected override Task OnInitializedAsync()
  47.     {
  48.         _context = dbFactory.CreateDbContext();
  49.         return base.OnInitializedAsync();
  50.     }
  51.     [Parameter]
  52.     public string Id { get; set; }
  53.     protected override void OnParametersSet()
  54.     {
  55.         Id = Id ?? "0";
  56.         if (!string.IsNullOrEmpty(Id))
  57.         {
  58.             if (Id!="0")
  59.             {
  60.                 int iId = int.Parse(Id);
  61.                 var book = _context.Book.Find(iId);
  62.                 if (book!=null)
  63.                 {
  64.                     addBook = book;
  65.                 }
  66.             }
  67.            
  68.         }
  69.     }
  70.     private void ValidSubmitInfo(EditContext editContext)
  71.     {
  72.         if (editContext.Model is  Book addBook)
  73.         {
  74.             Message = "你编辑的不是图书信息,校验通过。正在保存。";
  75.            
  76.         }
  77.     }
  78.     private void InvalidSubmitInfo(EditContext editContext)
  79.     {
  80.         if (editContext.Model is  Book addBook)
  81.       
  82.         {
  83.             Message = "你编辑的图书信息校验不通过,请修改。";
  84.         }
  85.     }
  86.     private void Save(EditContext editContext)
  87.     {
  88.         bool dataIsValid = editContext.Validate();
  89.         if (!dataIsValid)
  90.         {
  91.             Message = "你编辑的图书信息校验不通过,请修改。";
  92.             return;
  93.         }
  94.         if (editContext.Model is not Book addBook)
  95.         {
  96.             Message = "你编辑的不是图书信息。";
  97.             return;
  98.         }
  99.         _context.Add(editContext.Model);
  100.         int cnt=  _context.SaveChanges();
  101.         if (cnt>0)
  102.         {
  103.         Message = "图书信息保存成功!";
  104.         }else
  105.        {
  106.             Message = "图书信息保存失败!";
  107.        }
  108.     }
  109. }
复制代码
      3.在Visual Studio 2022的菜单栏上,找到“调试à开始调试”或是按F5键,Visual Studio 2022会生成BlazorAppDemo应用程序,并在浏览器中打开Home页面,我们我们使用鼠标左键点击左边菜单上的“图书列表”菜单项,浏览器会显示我们修改过的图书列表页面,将鼠标指针悬停在“编辑”链接上可以查看,链接背后的URL值,我们会在浏览器的左下角看到https://localhost:7110/AddBook/3这样的地址。如下图。


      4.在浏览器中,使用鼠标左键点击我们要修改的图书信息的“编辑”按钮,浏览器会自动跳转到AddBook页面,并将我们需要修改的图书信息显示出来。如下图。

 
七、路由约束

路由约束强制在路由段和组件之间进行类型匹配。
在以下示例中,到AddBook组件的路由仅在以下情况下匹配:

  • 请求 URL 中存在     Id 路由段。
  • Id 段是一个整数 (int) 类型。
  1. Pages/AddBook.razor:
  2. @page "/AddBook/{Id:int}"
  3. <h1>Book Id: @Id</h1>
  4. @code {
  5.     [Parameter]
  6.     public int Id { get; set; }
  7. }
复制代码
备注    路由约束不适用于查询字符串值。
    下表中显示的路由约束可用。 有关与固定区域性匹配的路由约束,请参阅表下方的警告了解详细信息。
约束

示例

匹配项示例

固定条件区域性 匹配

bool
{active:bool}
true, FALSE

datetime
{dob:datetime}
2016-12-31, 2016-12-31 7:32pm

decimal
{price:decimal}
49.99, -1,000.01

double
{weight:double}
1.234, -1,001.01e8

float
{weight:float}
1.234, -1,001.01e8

guid
{id:guid}
CD2C1638-1638-72D5-1638-DEADBEEF1638,
{CD2C1638-1638-72D5-1638-DEADBEEF1638}

int
{id:int}
123456789, -123456789

long
{ticks:long}
123456789, -123456789

警告
验证 URL 的路由约束并将转换为始终使用固定区域性的 CLR 类型(例如 int 或 DateTime)。 这些约束假定 URL 不可本地化。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表