IT评测·应用市场-qidao123.com

标题: 学习ASP.NET Core Blazor编程系列十——路由(下) [打印本页]

作者: 民工心事    时间: 2022-11-20 17:10
标题: 学习ASP.NET Core Blazor编程系列十——路由(下)
学习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编程系列十——路由(中)八、通过QueryString传参

       除了把参数直接拼接在URL路径(path)里,另一种常用的传递参数的方法是,将参数做为QueryString传递给跳转页面,比如“/BookIndex?Id=3”。可从 NavigationManager.Uri 属性中获取请求的查询字符串,在跳转页面中注入,具体代码如下。
  1. @inject NavigationManager NavigationManager 
  2. ... 
  3. var query = new Uri(NavigationManager.Uri).Query;
复制代码
         1. 在Visual Studio 2022的解决方案资源管理器中,找到 BookIndex.razor 组件,使用鼠标左键双击,在文本编辑器中打开,然后修改代码如下:
  1. @page "/BookIndex"
  2. @using BlazorAppDemo.Models
  3. @using Microsoft.EntityFrameworkCore
  4.  
  5. @inject IDbContextFactory<BookContext> dbFactory
  6.  
  7. <PageTitle>图书列表</PageTitle>
  8. <h3>图书列表</h3>
  9. <table class="table-responsive" width="90%"> 
  10.     <tr><td>Name</td>
  11.     <td>Author</td>
  12.     <td>Price</td>
  13.     <td>ReleaseDate</td>
  14.     <td>StockQty</td>
  15.     <td>Qty</td>
  16.     <td>操作</td>
  17.     </tr>
  18.     @foreach (var item in books)
  19.     {
  20.         <tr> 
  21.         <td>@item.Name</td>
  22.         <td>@item.Author</td>
  23.         <td>@item.Price</td>
  24.         <td>@item.ReleaseDate</td>
  25.         <td>@item.StockQty</td>
  26.         <td>@item.Qty</td>
  27.         <td><a target="_blank" href="https://www.cnblogs.com/AddBook?Id=@item.ID">编辑</a></td>
  28.     </tr>
  29.  
  30.     }
  31. </table>
  32.  
  33.  
  34. @code {
  35.     private   static BookContext _context;
  36.     private List<Book> books = new List<Book>();
  37.     protected override async Task OnInitializedAsync()
  38.     {
  39.         _context = dbFactory.CreateDbContext();
  40.         books=_context.Book.ToList();
  41.         await base.OnInitializedAsync();
  42.     }
  43. }
复制代码
         上面代码中,标签的那一行代码是通过把Id参数放在URL的QueryString中,将图书的ID传递给AddBook页面。

      2. 在Visual Studio 2022的解决方案资源管理器中,找到 AddBook.razor 组件,使用鼠标左键双击,在文本编辑器中打开,AddBook.razor组件注入NavigationManager,从 NavigationManager.Uri 属性中获取请求的查询字符串。修改代码如下:
  1. @page "/AddBook"
  2. @using BlazorAppDemo.Models
  3. @using Microsoft.EntityFrameworkCore
  4. @inject IDbContextFactory<BookContext> dbFactory
  5. @inject NavigationManager NavigationManager
  6.  
  7. <h3>AddBook</h3>
  8. <EditForm Model=@addBook OnValidSubmit=@ValidSubmitInfo  OnInvalidSubmit=@InvalidSubmitInfo>
  9.     <DataAnnotationsValidator />
  10.     <ValidationSummary />
  11.  
  12.     @Message
  13.     <p> 图书名称:
  14.     <InputText @bind-Value=addBook.Name></InputText>
  15.         <ValidationMessage For="@(() => addBook.Name)" />
  16.     </p>
  17.     <p>作者:
  18.     <InputText @bind-Value=addBook.Author></InputText>
  19.         <ValidationMessage For="@(() => addBook.Author)" />
  20.     </p>
  21.     
  22.     <p>出版日期:
  23.     <InputDate @bind-Value=addBook.ReleaseDate></InputDate>
  24.      </p>
  25.     <p>价格:
  26.     <InputNumber @bind-Value=addBook.Price></InputNumber>
  27.      </p>
  28.     <p>类型:
  29.      <InputText @bind-Value=addBook.Type></InputText>
  30.         <ValidationMessage For="@(() => addBook.Type)" />
  31.       </p>
  32.     <p>总页数:
  33.     <InputNumber @bind-Value=addBook.TotalPages></InputNumber>
  34.      </p>
  35.     <p>库存数量:
  36.     <InputNumber @bind-Value=addBook.StockQty></InputNumber>
  37.         <ValidationMessage For="@(() => addBook.StockQty)" />
  38.      </p>
  39.     <p>已租数量:
  40.     <InputNumber @bind-Value=addBook.Qty></InputNumber>
  41.     </p>
  42.     <input type="submit" class="btn btn-primary" value="Save" />
  43.  
  44. </EditForm>
  45. @code {
  46.     private string Message = string.Empty;
  47.     private static BookContext _context;
  48.     private Models.Book addBook = new Book();
  49.     protected override Task OnInitializedAsync()
  50.     {
  51.         _context = dbFactory.CreateDbContext();
  52.         return base.OnInitializedAsync();
  53.     }
  54.  
  55.     public string Id { get; set; }
  56.  
  57.     protected override void OnParametersSet()
  58.     {
  59.         var query = new Uri(NavigationManager.Uri).Query;
复制代码
        var str = query;
  1.      }
  2.  
  3.  
  4.     private void ValidSubmitInfo(EditContext editContext)
  5.     {
  6.  
  7.         if (editContext.Model is  Book addBook)
  8.         {
  9.             Message = "你编辑的不是图书信息,校验通过。正在保存。";
  10.            
  11.         }
  12.     }
  13.     private void InvalidSubmitInfo(EditContext editContext)
  14.     {
  15.         if (editContext.Model is  Book addBook)
  16.        
  17.         {
  18.             Message = "你编辑的图书信息校验不通过,请修改。";
  19.         }
  20.  
  21.     }
  22.     private void Save(EditContext editContext)
  23.     {
  24.         bool dataIsValid = editContext.Validate();
  25.         if (!dataIsValid)
  26.         {
  27.             Message = "你编辑的图书信息校验不通过,请修改。";
  28.             return;
  29.         }
  30.  
  31.  
  32.         if (editContext.Model is not Book addBook)
  33.         {
  34.             Message = "你编辑的不是图书信息。";
  35.             return;
  36.         }
  37.    if (string.IsNullOrEmpty(Id) || Id == "0" )
  38.         {
  39.             _context.Add(editContext.Model);
  40.         }
  41.      
  42.         int cnt=  _context.SaveChanges();
  43.         if (cnt>0)
  44.         {
  45.         Message = "图书信息保存成功!"; 
  46.         }
  47. else
  48.        {
  49.             Message = "图书信息保存失败!";
  50.        }
  51.     }
  52.  
  53. }
复制代码
      3.在Visual Studio 2022的菜单栏上,找到“调试--》开始调试”或是按F5键,Visual Studio 2022会生成BlazorAppDemo应用程序,并在浏览器中打开Home页面,我们我们使用鼠标左键点击左边菜单上的“图书列表”菜单项,浏览器会显示我们修改过的图书列表页面,将鼠标指针悬停在“编辑”链接上可以查看,链接背后的URL值,我们会在浏览器的左下角看到https://localhost:7110/AddBook?Id=3这样的地址。如下图。

      4.在浏览器中,使用鼠标左键点击我们要修改的图书信息的“编辑”按钮,浏览器会自动跳转到AddBook页面。我们在AddBook的OnParametersSet方法 中设置断点,我们看到QueryString是取到了,但是不是我们想到的那种形式,如下图红框。

        5.我们希望是获取的参数是一个字典集合,能通过键值,直接获取参数值,而不是上图中的这种字符串形式。Blazor看来没有对QueryString进行封装。所以我们需要通过QueryHelpers.ParseQuery方法将QueryString格式化成字典形式,然后通过输入KEY值获取对应的参数值。QueryHelpers类存Microsoft.AspNetCore.WebUtilities这个库里。我们修改OnParametersSet方法中的代码,具体代码如下所示:
  1. protected override void OnParametersSet()
  2.     {
  3.         var query = new Uri(NavigationManager.Uri).Query;
  4.         var queryDic = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);
  5.         Id = queryDic["Id"].ToString() ?? "0";
  6.         if (!string.IsNullOrEmpty(Id))
  7.         {
  8.             if (Id!="0")
  9.             {
  10.                 int iId = int.Parse(Id);
  11.                 var book = _context.Book.Find(iId);
  12.                 if (book!=null)
  13.                 {
  14.                     addBook = book;
  15.                 }
  16.             }
  17.         }
  18.     }
复制代码
      6.在浏览器中,使用鼠标左键点击我们要修改的图书信息的“编辑”按钮,浏览器会自动跳转到AddBook页面。我们在Visual Studio 2022的文本编辑器中的AddBook.razor文件的OnParametersSet方法 中设置断点,我们看到QueryString是取到了,我们看通过QueryHelpers.ParseQuery方法将QueryString格式化成字典形式,通过键值ID,我们取到了我们想到的参数值。如下图。
 
7.在Visual Studio 2022中按F5,让代码继续执行。回到浏览器中,页面已经自动跳转到AddBook页面,并将我们需要修改的图书信息显示出来。如下图。
 

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




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4