首页 > 编程语言 > 学习ASP.NET Core Blazor编程系列十——路由(下)

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

时间:2022-11-20 10:55:16浏览次数:69  
标签:Core ASP AddBook Blazor NET Id

学习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 属性中获取请求的查询字符串,在跳转页面中注入,具体代码如下。

@inject NavigationManager NavigationManager 

... 

var query = new Uri(NavigationManager.Uri).Query;
         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="/[email protected]">编辑</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();
    }

}

         上面代码中,<a>标签的那一行代码是通过把Id参数放在URL的QueryString中,将图书的ID传递给AddBook页面。

      2. 在Visual Studio 2022的解决方案资源管理器中,找到 AddBook.razor 组件,使用鼠标左键双击,在文本编辑器中打开,AddBook.razor组件注入NavigationManager从 NavigationManager.Uri 属性中获取请求的查询字符串。修改代码如下:

@page "/AddBook"
@using BlazorAppDemo.Models
@using Microsoft.EntityFrameworkCore
@inject IDbContextFactory<BookContext> dbFactory
@inject NavigationManager NavigationManager
 

<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();
    }
 
    public string Id { get; set; }
 
    protected override void OnParametersSet()
    {

        var query = new Uri(NavigationManager.Uri).Query;

        var str = query;

     }
 
 
    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;
        }
   if (string.IsNullOrEmpty(Id) || Id == "0" )
        {
            _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?Id=3这样的地址。如下图。

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

        5.我们希望是获取的参数是一个字典集合,能通过键值,直接获取参数值,而不是上图中的这种字符串形式。Blazor看来没有对QueryString进行封装。所以我们需要通过QueryHelpers.ParseQuery方法将QueryString格式化成字典形式,然后通过输入KEY值获取对应的参数值。QueryHelpers类存Microsoft.AspNetCore.WebUtilities这个库里。我们修改OnParametersSet方法中的代码,具体代码如下所示:

protected override void OnParametersSet()

    {

        var query = new Uri(NavigationManager.Uri).Query;
        var queryDic = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(query);

        Id = queryDic["Id"].ToString() ?? "0";

        if (!string.IsNullOrEmpty(Id))
        {
            if (Id!="0")
            {
                int iId = int.Parse(Id);
                var book = _context.Book.Find(iId);
                if (book!=null)
                {
                    addBook = book;
                }
            }
        }
    }
      6.在浏览器中,使用鼠标左键点击我们要修改的图书信息的“编辑”按钮,浏览器会自动跳转到AddBook页面。我们在Visual Studio 2022的文本编辑器中的AddBook.razor文件的OnParametersSet方法 中设置断点,我们看到QueryString是取到了,我们看通过QueryHelpers.ParseQuery方法将QueryString格式化成字典形式,通过键值ID,我们取到了我们想到的参数值。如下图。

 

7.在Visual Studio 2022中按F5,让代码继续执行。回到浏览器中,页面已经自动跳转到AddBook页面,并将我们需要修改的图书信息显示出来。如下图。

 

标签:Core,ASP,AddBook,Blazor,NET,Id
From: https://www.cnblogs.com/chillsrc/p/16908016.html

相关文章

  • ASP.NET Core教程-Pipeline(请求管道)
    更新记录转载请注明出处:2022年11月20日发布。2022年11月16日从笔记迁移到博客。请求管道是什么类似于水的管道,有流进流出。在ASP.NETCore中Server进行监听用户的......
  • Kubernetes(k8s)CNI(Calico)网络模型原理
    目录一、概述二、Calico架构和核心组件三、什么是BGP?三、Calico两种网络模式1)IPIP模式2)BGP模式四、安装Calico插件1)通过helm安装Calico2)通过yaml文件安装3)k8sflannel......
  • Mybatis出现Caused by: net.sf.jsqlparser.parser.ParseException: ....异常
    今天在开发项目中遇到了一个奇怪的异常,记录一下把!异常信息如下(截取了主要的部分)Causedby:net.sf.jsqlparser.parser.ParseException:Encountered""TOP""top""at......
  • .netcore 3.1 部署至Docker
    1.在工程中添加Dockerfile2.在文件中写入配置信息1FROMmcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim2WORKDIR/app3EXPOSE90904COPY..5ENTRY......
  • 2018 Make Some Noise: Unleashing the Power of Convolutional Neural Networks for P
    一、CNN和人工噪声1Sample-levelCNN(RD网络)设计原则:类似于VGG结构的一维输入小过滤器连续卷积块直到特征维度下降到1通道个数从一个较小的数持续扩大引入......
  • ASP.NET Core 6部署到IIS
    1.打开IIS,新建一个网站2.给新创建的应用程序池,设置为无托管代码,下面那个选经典或集成好像都没问题 3.运行网站,不出意外的话,会报错,提示HTTP错误500.19,说明网站目录权......
  • Homework 5: Social networking and recommendation systems
    Homework5:SocialnetworkingandrecommendationsystemsBackgroundRecommendationsystemsFacebooksuggestspeopleyoumaybe(ormightwanttobe)friendswi......
  • 篇(14)-Asp.Net Core入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)
    入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)前面几章讲了菜单功能的管理之后,我们再创建一个角色管理的功能,创建过程不再详细介绍,只要按照菜单管理功能的步骤进......
  • kubeadm创建kubernetes集群
    kubeadm创建kubernetes集群参照使用Kubeadm引导集群,进行集群的创建。一、安装kubeadm1.1准备开始这里我准备了3台服务器进行安装,均是通过Vbox创建centos7.6版本的虚......
  • kubernetes应用4
    16、Deployment编排运行wordpress、jpress要求:把nginx或wordpress都做成多实例,测试滚动更新过程,验证更新过程中,服务是否中断;并写出验证报告#基于上边部署的wordpress资源修......