码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 学习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 属性中获取请求的查询字符串,在跳转页面中注入,具体代码如下。

    复制代码
    @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 dbFactory
    
     
    
    图书列表
    
    

    图书列表

    class="table-responsive" width="90%">  @foreach (var item in books) {     }
    Name Author Price ReleaseDate StockQty Qty 操作
    @item.Name @item.Author @item.Price @item.ReleaseDate @item.StockQty @item.Qty "/AddBook?Id=@item.ID">编辑
        @code { private static BookContext _context; private List books = new List(); protected override async Task OnInitializedAsync() { _context = dbFactory.CreateDbContext(); books=_context.Book.ToList(); await base.OnInitializedAsync(); } }
    复制代码

             上面代码中,标签的那一行代码是通过把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 dbFactory
    @inject NavigationManager NavigationManager
     
    
    

    AddBook

     
    @Message

    图书名称: "@(() => addBook.Name)" />

    作者: "@(() => addBook.Author)" />

        

    出版日期:

    价格:

    类型: "@(() => addBook.Type)" />

    总页数:

    库存数量: "@(() => addBook.StockQty)" />

    已租数量:

    "
    submit" class="btn btn-primary" value="Save" />   @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页面,并将我们需要修改的图书信息显示出来。如下图。

     

  • 相关阅读:
    微擎模块 砍价宝小程序 6.4.0全开源版安装更新一体包 砍价抢购拼团模式商家入驻
    【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【漏洞复现】panalog日志审计系统任意用户创建漏洞和后台命令执行
    JavaEE开发之SpringMVC框架整合1
    三体目标管理笔记
    IDEA03:数据库CDC、Kafka和连接器Debezium配置
    JAVA基础——【笔记】14.集合
    最优化理论-最速下降法的推导与应用
    黑客专业术语认知
    学习spring源码的意义是什么呢?有什么高效的源码学习方式吗?
  • 原文地址:https://www.cnblogs.com/chillsrc/p/16908016.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号